当前位置: 首页 > 知识库问答 >
问题:

Hibernate约束违反异常

苏高旻
2023-03-14

我正在使用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个答案

田博超
2023-03-14

我会尝试如下方法,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);
 }
夏侯弘量
2023-03-14

在当前设置下,您将在< code>user对象中获得旧的< code>Usersettings。这是因为< code>merge方法的工作方式。它的工作方式是创建对象的副本,然后< code >持久化和< code >刷新对象并将其返回。因此,本质上,您传递给< code>userManager的< code>user对象不会被更新,但是您必须获得更新后的< code>user的返回值

 类似资料:
  • 我有一个MathematicsAnswer引用的实体数学。如果对数学执行post请求,我会得到一个例外,即MathsAnswer上的字段不能为空。但我确实在球场上跳了起来。拜托,我需要这个解决方案<代码>java.sql。SQLIntegrityConstraintViolationException:列'question_id'不能为空。 sql架构: 实体类: MathsAnswers.jav

  • 我已经研究了许多其他关于不捕捉异常的问题(包括不能捕捉约束违反异常),但没有一个问题和我一样。 使用RestEasy联网和Hibernate链接Postgres db。 我有一个目标: db服务通过OutcomResource.save输出发送一个输出: 然后由OutcomRepository.save保存在db中: 当为用户发布并保存第一个结果时,它成功地保存在数据库中。如果发布了第二个结果,则

  • 问题内容: 我正在使用Oracle数据库。我们的服务呼叫频繁失败。当我查看日志时,在表上看到以下异常 java.sql.BatchUpdateException:ORA-00001:违反了唯一约束(DBSCHEMA.IDX_CO_DETAILS)。 我已经检查了表上索引的索引名称DBSCHEMA.IDX_CO_DETAILS。 它不包含任何列的(INCLUDE_COLUMN为null)。我怎么知道

  • 我在项目中使用Spring数据,并使用JPA在实体和表之间进行映射,这是我的实体 这是我的回购 当我尝试保存时,我遇到了以下问题:

  • 问题内容: 我遇到了一个项目有两次相同的.jar(对于我来说,是el-api.jar v2.1)两次的问题,因此,当我尝试使用Tomcat 6运行项目时,出现了以下错误堆栈。 我发现了 http://blog.springsource.com/2008/10/20/understanding-the-osgi-uses- directive/ 但这没有用,因为解决方案影响了我项目的太多部分。 我无

  • 帮助我如何解决这个问题?我正在使用java进行NetSuite集成,我将所需的jar文件添加到我的项目中。添加jboss 6.1.0中部署的jar后。添加此jar后org.apache.sling.commons.log-2.0.6.jar获得以下异常。这是我的堆栈跟踪。