Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠约束冲突异常_Java_Spring_Hibernate - Fatal编程技术网

Java 休眠约束冲突异常

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

我将Spring与Hibernate一起使用,我得到了这个异常。 以下是我想要得到的: 我有User和UserSettings类,它们由OneToMany和manytone注释绑定,如下所示:

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。在这种情况下,我需要向该集添加设置吗?