所有实体的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;
}
...
}
我有以下数据库结构,其中每个 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;
}
...
}