所有实体的Hibernate Common Primary Key部分

时间:2015-12-04 12:28:50

标签: java hibernate hibernate-annotations

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

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   

实体结构应该像我可以在表A上使用CPK1,CPK2,CPK3,CPK4,IDPKA查询,并且应该以适当的关系检索所有数据。

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

如果有可能请帮助,如果不可能请告诉我一些出路。

1 个答案:

答案 0 :(得分:0)

由于您只是将表与IDPKA相关联,因此IDPKB和IDPKC会忘记其他列。它们看起来就像那些表格的常用列。如果你想改进搜索,你可以在以后制作复合索引,但现在不是我们的主题。

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

  

A - (1-N) - >乙 - (1-N) - &以及c

那些绑定(从左到右)应该有 fetch = FetchType。 EAGER 配置,这样你就可以获得所有B和C,只有一个选择A. / p>

正如预期的那样,映射的左对连接权是多对一的。这种映射可以是EAGER,也可以不是,这取决于你。

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

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;
    }
    ... 
}