我有两个JPA实体,inbox/
和Parent
。
家长有Child
和@Id
。
对于每个父母(id和版本为FK),有多个孩子。
@Version
和
@Entity
@Table(name = "parent")
public class ParentDao implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "parent_id")
private Long parentId;
@Version
@Column(name = "parent_version", updatable = false)
private Long parentVersion;
...
}
如果版本没有约束,孩子对父母的FK,则该关系就是。
@Entity
@Table(name = "child")
public class ChildDao implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "child_id")
private Long childId;
@Column(name = "parent_id", updatable = false)
private Long parentId;
@Column(name = "parent_id", updatable = false)
private Long parentVersion;
...
}
Hibernate将版本视为特殊字段,因为在属性级别设置了@OneToMany(mappedBy = "parentId", cascade = CascadeType.ALL)
private Set<ChildDao> children = new HashSet<>(0);
注释。
因此,我可以想象,在实现一对多关系时,他们可能会想到这一点。
尽管如此,可能还有更通用的解决方案。
那么,如何在一对多关系中添加版本作为约束?
答案 0 :(得分:2)
在RDBMS中,FK引用PK。那么,Child FK必须引用Parent实体标识符,对吗?
version
永远不应该形成FK因为版本不断变化,而FK不应该因为它必须引用不可变的 FK。
如果您需要自定义表达集合的方式,则应使用@JoinFormla
instead of @JoinColumn
。
此外,Child
映射无论如何都是错误的,因为您正在复制parent_id
映射:
@Column(name = "parent_id", updatable = false)
private Long parentId;
@Column(name = "parent_id", updatable = false)
private Long parentVersion;
也许你想拥有:
@Column(name = "parent_id", updatable = false)
private Long parentId;
@Column(name = "parent_version", updatable = false)
private Long parentVersion;