gpt4 book ai didi

java - 使用 id 和 version 列映射一对多关系

转载 作者:行者123 更新时间:2023-12-02 02:37:01 25 4
gpt4 key购买 nike

我有两个 JPA 实体:ParentChild

父级有一个@Id和一个@Version

对于每个父级(ID 和版本为 FK),都有多个子级。

@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;

...
}

@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;

...
}

如果版本没有约束,即子级与父级之间的 FK,则关系将会是。

@OneToMany(mappedBy = "parentId", cascade = CascadeType.ALL)
private Set<ChildDao> children = new HashSet<>(0);

Hibernate 将版本视为特殊字段,因为在属性级别设置了 @Version 注释。

因此,我可以想象,也许他们在实现一对多关系时想到了这一点。

尽管如此,可能还有更通用的解决方案。

那么,如何将版本添加为一对多关系中的约束?

最佳答案

在 RDBMS 中,FK 引用 PK。那么,Child FK 必须引用 Parent 实体标识符,对吗?

版本永远不应该形成FK,因为版本不断变化,而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;

关于java - 使用 id 和 version 列映射一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46177710/

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