gpt4 book ai didi

java - Spring Data JPA 使用级联保存导致 EntityExistsException

转载 作者:行者123 更新时间:2023-12-02 04:27:33 26 4
gpt4 key购买 nike

我有一个 Challenge 类,它与 User 类具有多对一的关系。它是单向的,所以看起来像这样:

@Entity
@Table(name = "UserTable")
public class User {
@Id
private String userId;
}

@Entity
@Table(name = "ChallengeTable")
public class Challenge {
@Id
private String challengeId;

@ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
@JoinColumn(name = "userId")
private User user;
}

我正在使用 Spring Data JPA,当我在 Challenge 中使用 CRUDRepository 中的 save 方法时code> 对象,我希望它保留附加用户(如果该用户尚不存在),并将该用户合并到旧用户(如果已经存在)。

我在 UserRepository 中使用 findOne(String id) 方法来获取使用 userId 的用户,这就是用户我正在设置挑战

如果用户尚不存在,它可以很好地级联,但是当我尝试使用预先存在的用户保存它时,我得到了异常:

javax.persistence.EntityExistsException: a different object with the same identifier value was already associated with the session: [com.mywebsite.model.User#zk9moo78sx685g6o9yphegdx6lpoll9x]

我不确定我在这里做错了什么。将 CascadeType 更改为 ALL 不会改变任何内容。尝试完全删除 CascadeType 并首先手动保存用户也不起作用。这给了我错误:

org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing: com.mywebsite.model.Challenge.user -> com.mywebsite.model.User

这似乎是在事务退出时发生的(因为我的服务层类用 @Transactional 注释)。

如果我取出 @Transactional 注释并手动保留用户,则似乎一切正常。 (不过,我仍然希望在服务级别上进行级联保存和事务。)

取出@Transactional并尝试使用级联保存失败,并出现SQLIntegrityConstraintViolationException异常,因为User似乎成为一个独立的实体它尝试重新保留它,但该主键已经存在,因此失败。

任何人都可以帮助我了解这里发生的情况,并帮助我在 Spring Data JPA 中使用事务进行级联保存吗?

最佳答案

我尝试使用 Hibernate 特定的级联选项,以及我能想到的所有其他选项,但我无法让级联保存像 Hibernate CascadeType.SAVE_UPDATE 那样工作。我相信这是 JPA 与 Spring Data 的硬限制。

相反,我在服务和接口(interface)存储库之间添加了一个层。它保存了依赖实体(用户),然后保存了挑战。

关于java - Spring Data JPA 使用级联保存导致 EntityExistsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16326916/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com