Hibernate约束违例异常

时间:2014-01-31 13:32:43

标签: java spring hibernate

我正在使用Spring和Hibernate,我得到了这个异常。 这是我想要得到的: 我有User和UserSettings类,它们与OneToMany和ManyToOne注释绑定在一起:

public class UserImpl implements User, Serializable {

...some fields 

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "user", orphanRemoval = true)
    private Set<UserSettingsImpl> settings;

}

public class UserSettingsImpl implements UserSettings, Serializable {

...some fields

    @ManyToOne(cascade = CascadeType.ALL)
    private UserImpl user;

}

现在,我想为用户添加设置,我就是这样做的:

public long addSettings(final UserSettings settings) {
    userSettingsDAO.persist((UserSettingsImpl) settings);
    UserSettingsImpl settingsImpl = (UserSettingsImpl) settings;
    User user = settings.getUser();
    Set<UserSettingsImpl> settingsSet = (Set<UserSettingsImpl>) user.getSettingsSet();
    settingsSet.add(settingsImpl);
    userManager.updateUser(user); //it's just entityManager.merge(user);
    return ((UserSettingsImpl) settings).getId();
}

问题出现了: 来自UserSettings的用户使用旧设置和新设置(我刚创建并想要添加的设置)进行设置,但旧设置包含用户的设置,其中没有新设置。这就是为什么我得到例外,我想,但我不知道如何解决它。 (我想我正在以错误的方式使用Hibernate)

2 个答案:

答案 0 :(得分:1)

您将使用当前设置在Usersettings对象中获得旧user。 这是因为merge方法的工作方式。 它的工作方式是创建对象的副本,然后persistrefresh对象并将其返回。因此,在本质上,您传递给user的{​​{1}}对象将不会更新,但您必须获取更新后的userManager

的返回值

答案 1 :(得分:0)

我会尝试类似下面的内容,userImpl由UserSettingsImpl的关系引用,如果你持久化UserSettingsImpl,则由于级联而将操作应用于UserImpl,如果UserImpl是新的,它将被保留,否则没有任何反应。

public long saveSettings(final UserSettings settings) {
    userSettingsDAO.persist((UserSettingsImpl) settings);
    return ((UserSettingsImpl) settings).getId();
}

并管理UserImpl类中的双向关系:

 @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "user", orphanRemoval = true)
 private Set<UserSettingsImpl> settings = new HashSet<UserSettingsImpl>();

 public void addUserSettings(UserSettings userSettings) {
    this.settings.add(userSettings);
    userSettings.setUserImpl(this);
 }