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

时间:2017-09-12 13:26:32

标签: java hibernate jpa version one-to-many

我有两个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); 注释。

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

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

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

1 个答案:

答案 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;