所有实体的Hibernate公共主键部分

Hibernate Common Primary Key part of All Entity

我有以下数据库结构,其中每个 table 上都有一些特定的列,这些列(CPK1、CPK2、CPK3、CPK4)是所有 table 的主键的一部分。此外,每个 table 都有一个额外的主键,它是实际的主键并在另一个 table 上引用为外键(IDPKA 在 TableB 中,IDPKB 在 TableC 中)。我无法为那些 table 创建实体结构。

TableA
-------------------------------------------------------------
CPK1    CPK2    CPK3    CPK4    IDPKA   A1
-------------------------------------------------------------
10      1       2       3       1       XYZ 
-------------------------------------------------------------

TableB
-------------------------------------------------------------
CPK1    CPK2    CPK3    CPK4    IDPKB   B1  IDPKA
-------------------------------------------------------------
10      1       2       3       1       BDATA1  1
10      1       2       3       2       BDATA2
-------------------------------------------------------------

TableC
-------------------------------------------------------------
CPK1    CPK2    CPK3    CPK4    IDPKC   C1  IDPKB
-------------------------------------------------------------
10      1       2       3       1       ABCD    1
10      1       2       3       2       PQRS    1
10      1       2       3       3       ABCD1   2
10      1       2       3       4       PQRS1   2
-------------------------------------------------------------

根据数据如下是关系。

XYZ
|
|---BDATA1
|   |
|   |---ABCD    
|   |---PQRS    
|
|---BDATA2
|   |
|   |---ABCD1   
|   |---PQRS1   

实体结构应该是这样的,我可以用 CPK1、CPK2、CPK3、CPK4、IDPKA 查询 Table A,并且所有数据都应该以适当的关系检索。

还有一件事我在实体 POJO 上使用注释。

如果可以请帮忙,如果不行请告诉我一些出路。

由于您仅使用 IDPKA 将表相互关联,因此 IDPKB 和 IDPKC 忘记了其他列。它们似乎只是这些表的常规列。如果你想改进搜索,稍后你会用它们制作复合索引,但这不是我们现在的主题。

据我了解,两者之间的两个关系都是一对多的。只需搜索 Hibernate 教程即可通过注释建立这些绑定。

A--(1-n)-->B--(1-n)-->C

那些绑定(假设从左到右)应该有 fetch = FetchType.EAGER 配置,所以你可以获得所有 B 和Cs 有一个选择 A.

正如预期的那样,映射存在从右到左的多对一连接。此映射可以是 EAGER 或不是,由您决定。

EAGER 的重点是:如果您的实体是多对多的并且使用了 EAGER,则可能会导致启动选择所有 DB 数据。应始终牢记这一点。
样本:

public class A {    
    ...
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "a")
    @Fetch(FetchMode.SELECT)
    public List<B> getBs() {
        return this.bs;
    }       
    ...
}

public class B {        
    ...
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "IDPKA")
    public A getA() {
        return this.a;
    }
    ... 
}