我正在使用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)
答案 0 :(得分:1)
您将使用当前设置在Usersettings
对象中获得旧user
。
这是因为merge
方法的工作方式。
它的工作方式是创建对象的副本,然后persist
和refresh
对象并将其返回。因此,在本质上,您传递给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);
}