Java 休眠所有实体的公共主键部分

Java 休眠所有实体的公共主键部分,java,hibernate,hibernate-annotations,Java,Hibernate,Hibernate Annotations,我有以下数据库结构,其中每个表上都有一些特定的列,这些列(CPK1、CPK2、CPK3、CPK4)是所有表的主键的一部分。此外,每个表都有一个额外的主键,它是实际的主键,在另一个表中作为外键引用(表B中的IDPKA,表C中的IDPKB)。我无法为这些表创建实体结构 TableA ------------------------------------------------------------- CPK1 CPK2 CPK3 CPK4 IDPKA A1 -----

我有以下数据库结构,其中每个表上都有一些特定的列,这些列(CPK1、CPK2、CPK3、CPK4)是所有表的主键的一部分。此外,每个表都有一个额外的主键,它是实际的主键,在另一个表中作为外键引用(表B中的IDPKA,表C中的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   
实体结构应该是这样的,我可以用CPK1、CPK2、CPK3、CPK4、IDPKA查询表A,所有数据都应该以适当的关系检索

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


如果可能,请提供帮助,如果不可能,请告诉我一些解决方法。

因为您仅使用IDPKA、IDPKB和IDPKC将表相互关联,请忽略其他列。它们似乎只是这些表的常规列。如果您想改进搜索,您可以稍后使用这些索引制作复合索引,但这不是我们现在的主题。

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

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

这些绑定(从左到右)应该具有fetch=FetchType。EAGER配置,这样您就可以通过一个选择获取所有的Bs和Cs

正如预期的那样,映射有一个从右到左的多对一连接。这个映射可以是急切的,也可以不是,这取决于您

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;
    }
    ... 
}
公共A类{
...
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER,mappedBy=“a”)
@Fetch(FetchMode.SELECT)
公共列表getBs(){
返回此文件。b;
}       
...
}
公共B类{
...
@manytone(fetch=FetchType.EAGER)
@JoinColumn(name=“IDPKA”)
公共A getA(){
归还这个;
}
... 
}

谢谢您的意见。我已经用你们共享的方法创建了一些实体。一切都很顺利。即使是埃格也会抓人。我将相应地更新问题。但我的观点是IDPKC可能有相同的值,但CPK1不同。那样的话,就会有问题了