如何解决JPA 与具有继承的实体共享 pk 关系
是否可以通过共享密钥与具有 TABLE_PER_CLASS 继承的实体建立一对一关系?
我有 UserEntity 和 DetailsEntity,它们是一对一的。 UserEntity 与 DetailsEntity 共享 pk(没有 UserEntity,DetailsEntity 没有意义,反之亦然)。 DetailsEntity 是不同类型 Details 的父类。
@Entity
@Table(schema = "USERS",name = "USER")
data class UserEntity(
@Id
@Column(name = "ID")
var id: String,@OnetoOne(mappedBy = "user",cascade = [CascadeType.ALL],orphanRemoval = true)
var details: DetailsEntity?
)
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
abstract class DetailsEntity(
@Id
@Column(name = "ID")
var id: String,@MapsId
@OnetoOne
@JoinColumn(name = "ID")
var user: UserEntity
)
@Entity
@Table(schema = "USERS",name = "USER_DETAILS")
class UserDetailsEntity(
id: String,user: UserEntity,): DetailsEntity(id,user)
@Entity
@Table(schema = "USERS",name = "CUSTOMER_DETAILS")
class CustomerDetailsEntity(
id: String,@Column(name = "CUSTOMER_ID")
var customerId: Long
): DetailsEntity(id,user)
除非一种 Details 被另一种替代,否则这种结构可以正常工作。
例如
UserEntity user = UserEntity("id")
Details details = UserDetailsEntity("id")
user.details = details
details.user = user
repo.save(user) //This works fine. User and details are persisted.
Details newDetails = CustomerDetailsEntity("id")
user.details = newDetails
newDetails.user = user
repo.save(user) // This leads to "A different object with the same identifier value was already associated with the session : [ru.raiffeisen.rmcp.user.adapter.out.persistence.entity.CustomerDetailsEntity#id]"
我了解问题的性质 - 来自单个层次结构的两个实体同时出现在 PersistenceContext 中:UserDetailsEntity("id") 和 CustomerDetailsEntity("id")。
我曾尝试在替换之前分离旧的 UserDetailsEntity,但在合并 UserEntity 期间,它将 UserDetailsEntity("id") 加载回处于 MANAGED 状态的 PersistenceContext,并且发生了相同的错误。
有没有办法用可替换的细节来组织这种关系?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。