草庐IT

java - hibernate 多对多关联不更新连接表

coder 2024-03-14 原文

在我的应用程序中,我在 User 和 Preference 实体之间建立了多对多关联。由于连接表需要一个额外的列,我不得不将其分解为 2 个一对多关联:

用户实体:

@OneToMany(mappedBy = "user", fetch = FetchType.EAGER, cascade={CascadeType.PERSIST, CascadeType.MERGE}, orphanRemoval = true)
public Set<UserPreference> getPreferences() 
{
    return preferences;
}

偏好实体:

@OneToMany(mappedBy = "preference", fetch = FetchType.EAGER)
public Set<UserPreference> getUserPreferences() 
{
    return userPreferences;
}

用户偏好实体:

@ManyToOne
@JoinColumn(name = "user_id", nullable = false)
public User getUser() 
{
    return user;
}

public void setUser(User user) 
{
    this.user = user;
}

@ManyToOne
@JoinColumn(name = "preference_id", nullable = false)
public Preference getPreference() 
{
    return preference;
}

public void setPreference(Preference preference) 
{
    this.preference = preference;
}

@Column(nullable = false, length = 25)
public String getValue() 
{
    return value;
}

public void setValue(String value) 
{
    this.value = value;
}

为了更新其中一个首选项,我遍历了用户的首选项集并按如下方式更新值:

@RequestMapping(value = {"/edit-{id}-preference"}, method = RequestMethod.POST)
public String updateUserPreference(@ModelAttribute("userPreference") UserPreference preference, BindingResult result, ModelMap model) 
{
    User loggedInUser = (User)session.getAttribute("loggedInUser");

    for (UserPreference pref : loggedInUser.getPreferences())
    {
        if (Objects.equals(pref.getId(), preference.getId()))
        {
            pref.setValue(preference.getValue());
        }
    }

    userService.update(loggedInUser);

    return "redirect:/users/preferences";
}

我已确认我尝试更新的用户变量确实包含此代码运行后的新值。更奇怪的是,当重定向发生时,网页上的值确实会更新,但数据库不会更新!这是我用来进行更新的代码,这个类用@Transactional 注释并且每次调用这个方法(例如更新用户的角色)都完美地工作:

@Override
public void update(User user) 
{
    User entity = dao.findById(user.getId());
    if (entity != null)
    {
        entity.setUserId(user.getUserId());
        entity.setPassword(user.getPassword());
        entity.setFirstName(user.getFirstName());
        entity.setLastName(user.getLastName());
        entity.setRole(user.getRole());
        entity.setPreferences(user.getPreferences());
    }
}

这就像 hibernate 的 session “缓存”具有更新的值但实际上并没有持久化它。我正在为大约 30 个其他实体使用这种完全相同的更新方法样式,并且一切正常。这是我唯一的多对多关联,我必须将其分解为 2 个一对多关联,因此我没有什么可比较的。

我做错了什么吗?当我使用新的 HashSet 创建用户并将其持久化时,该值被正确写入“连接表”。

*****编辑*****

为了比较,这是我用来创建具有默认首选项的新用户的代码。首选项已经存在,但连接表完全是空的,这段代码正确地保留了实体:

User user = new User();
        user.setUserId("admin");
        user.setPassword(crypter.encrypt("admin"));
        user.setFirstName("admin");
        user.setLastName("admin");
        user.setRole(roleService.findByName("Admin"));

        Set<UserPreference> userPreferences = new HashSet<>();

        Preference preference = preferenceService.findByName("anchorPage");
        UserPreference userPreference = new UserPreference();
        userPreference.setUser(user);
        userPreference.setPreference(preference);
        userPreference.setValue("System Statistics");
        userPreferences.add(userPreference);

        preference = preferenceService.findByName("showOnlyActivePatients");
        userPreference = new UserPreference();
        userPreference.setUser(user);
        userPreference.setPreference(preference);
        userPreference.setValue("true");
        userPreferences.add(userPreference);

        user.setPreferences(userPreferences);

        userService.save(user);

谢谢

最佳答案

代替

entity.setPreferences(user.getPreferences());

做类似的事情:

for( UserPreference uf : user.getPreferences() ) {
    entity.getPreferences().add( uf );
}

这里的主要区别在于您没有更改由 Hibernate 管理的列表引用,而只是向其中添加元素。

关于java - hibernate 多对多关联不更新连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50608324/

有关java - hibernate 多对多关联不更新连接表的更多相关文章

  1. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  2. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  3. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  4. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  5. ruby - 无法在 60 秒内获得稳定的 Firefox 连接 (127.0.0.1 :7055) - 2

    我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类

  6. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  7. ruby - Rails 关联 - 同一个类的多个 has_one 关系 - 2

    我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下

  8. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  9. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  10. ruby-on-rails - 复数 for fields_for has_many 关联未显示在 View 中 - 2

    目前,Itembelongs_toCompany和has_manyItemVariants。我正在尝试使用嵌套的fields_for通过Item表单添加ItemVariant字段,但是使用:item_variants不显示该表单。只有当我使用单数时才会显示。我检查了我的关联,它们似乎是正确的,这可能与嵌套在公司下的项目有关,还是我遗漏了其他东西?提前致谢。注意:下面的代码片段中省略了不相关的代码。编辑:不知道这是否相关,但我正在使用CanCan进行身份验证。routes.rbresources:companiesdoresources:itemsenditem.rbclassItemi

随机推荐