我有以下数据库结构,其中每个表上都有一些特定的列,这些列(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上使用注释还有一件事。
如果有可能请帮助,如果不可能请告诉我一些出路。
答案 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;
}
...
}