Java 休眠约束冲突异常
我将Spring与Hibernate一起使用,我得到了这个异常。 以下是我想要得到的: 我有User和UserSettings类,它们由OneToMany和manytone注释绑定,如下所示:Java 休眠约束冲突异常,java,spring,hibernate,Java,Spring,Hibernate,我将Spring与Hibernate一起使用,我得到了这个异常。 以下是我想要得到的: 我有User和UserSettings类,它们由OneToMany和manytone注释绑定,如下所示: public class UserImpl implements User, Serializable { ...some fields @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "us
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类UserImpl实现用户,可序列化{
…一些领域
@OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL,mappedBy=“user”,orphan=true)
私人设置;
}
公共类UserSettingSiml实现UserSettings,可序列化{
…一些领域
@多通(级联=级联类型.ALL)
私有用户impl用户;
}
现在,我想为用户添加设置,我就是这样做的:
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();
}
public long addSettings(最终用户设置){
userSettingsDAO.persist((UserSettingsImpl)设置);
UserSettingSiml SettingSiml=(UserSettingSiml)设置;
User=settings.getUser();
Set settingsSet=(Set)user.getSettingsSet();
设置set.add(设置简单);
userManager.updateUser(用户);//它只是entityManager.merge(用户);
return((userSettingSiml)settings).getId();
}
问题来了:
UserSettings中的用户使用旧设置和新设置(我刚刚创建并要添加的设置)保存集合,但旧设置使用用户保存集合,其中没有新设置。我想这就是为什么我会遇到异常,但我不知道如何修复它。(我认为我使用Hibernate的方式是错误的)我会尝试下面这样的方法,userImpl由UserSettingSiml的关系引用,如果持久化UserSettingSiml,操作将由于级联而应用于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);
}
@OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL,mappedBy=“user”,orphandremovation=true)
私有集设置=新HashSet();
public void addUserSettings(UserSettings UserSettings){
this.settings.add(userSettings);
setUserImpl(这个);
}
您将在当前设置的用户
对象中获得旧的用户设置
。
这是因为,merge
方法的工作方式。
它的工作方式是创建对象的副本,然后
持久化
和刷新
对象并将其返回。因此,本质上,传递给userManager
的user
对象不会被更新,但您必须获得更新的user
的返回值。您能详细说明或改写旧设置和新设置的含义吗?@Hrishikesh当然:这些是我想要添加的设置(我亦修改了质询)addSettings是User中的一个方法吗?@EmersonFarrugia不,我有一个UserSettingsManager类,这个方法属于它。你是说你最终得到了两个用户对象,一个设置集大小为2,另一个设置集大小为1?好的,所以我不需要更新User。在这种情况下,我需要向该集添加设置吗?