我有一个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
,当我使用对象上的save
方法时,如果该用户不存在,我希望它保留附加的用户,如果它已经存在,则将用户合并到旧用户中。CRUDRepository
Challenge
我在 中使用一种findOne(String id)
方法UserRepository
来获取使用 的用户userId
,这就是我在 中设置的用户Challenge
。
如果用户不存在,它会很好地级联,但是当我尝试使用预先存在的用户保存它时,我得到了异常:
javax.persistence.EntityExistsException: a different object with the same identifier value was already associated with the session: [com.mywebsite.model.User#zk9moo78sx685g6o9yphegdx6lpoll9x]
我不确定我在这里做错了什么。更改CascadeType
toALL
不会改变任何东西。尝试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
吗?