【问题标题】:Hibernate Common Primary Key part of All Entity所有实体的休眠公共主键部分
【发布时间】:2015-12-04 21:36:33
【问题描述】:

我有以下数据库结构,每个表上都有一些特定的列,这些列(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   

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

我在实体 POJO 上使用注释的另一件事。

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

【问题讨论】:

    标签: java hibernate hibernate-annotations


    【解决方案1】:

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

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

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

    那些绑定(比如说从左到右)应该具有 fetch = FetchType.EAGER 配置,这样您就可以通过一个选择 A 来获得所有 B 和 C。

    正如预期的那样,映射有一个从右到左的连接,它是多对一的。此映射可以是 EAGER 还是 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;
        }
        ... 
    }
    

    【讨论】:

    • 感谢您的意见。我已经创建了一些与您共享的相同方法的实体。事情运行得非常好。甚至 EGER 也可以取回。我会相应地更新问题。但我的观点是 IDPKC 可能具有相同的值但 CPK1 不同。在那种情况下会有一些问题
    猜你喜欢
    • 2018-02-11
    • 1970-01-01
    • 2015-08-20
    • 2014-02-26
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 2012-01-25
    相关资源
    最近更新 更多