在高级别,我有一个“MainClass”类,其中包含“OtherEntity”列表。基本上有两个连接表。这两个连接表中包含其他组件使用的元数据,但我没有定义实体,因为我们在连接操作之外不需要它们。但基本上MainClass => TableOne => TableTwo => OtherEntity
我的实体定义
@Entity
public class MainClass {
// other stuff ...
// how to?
@OneToMany
private List<OtherEntity> otherEntities;
}
@Entity
public class OtherClass { // other stuff ... }
我的架构(遗留且无法修改)
table MainClass
PK id
...
table TableOne
PK id
FK main_class_id
FK table_two_id
table TableTwo
PK id
FK table_one_id
FK other_entity_id
table OtherEntity
PK id
...
如果可以的话,我想避免为TableOne和TableTwo创建实体。
答案 0 :(得分:1)
考虑使用@SecondaryTable它应该适用于遗留模式,使用此注释可以在一个实体中包含字段,并且只定义哪些将构成其他表的一部分,但是您只有2个实体。
检查this教程
Idea是来自不同表中的一个实体的拆分字段,无需创建其他实体,只需定义哪个字段位于哪个表中。
@SecondaryTables{@SecondaryTable(name="XX")}
并在表之间移动字段使用
@Column(table="XX")
在你的配置中尝试这样的事情。
@Entity
@SecondaryTables{@SecondaryTable(name="TableOne"), @SecondaryTable(name="TableTwo")}
table MainClass
PK id
@Column(table="TableOne")
FK main_class_id
@Column(table="TableOne")
FK table_two_id
@Column(table="TableTwo")
PK id
@Column(table="TableTwo")
FK table_one_id
@Column(table="TableTwo")
FK other_entity_id
对于中间表中的ID,请考虑删除@Id并自动设置它,它应该工作!!
答案 1 :(得分:0)
问题是最终会解决的设计问题。我们有一个数据库视图,提供统一的查找表。在数据库层,我们可以单独分配各个部分。
@Entity
public class MainClass {
@OneToMany
@JoinTable(name = "TheViewName",
joinColumns = @JoinColumn(name = "id", insertable = false, updatable= false),
inverseJoinColumns = @JoinColumn(name = "other_id", insertable = false,
updatable = false))
private List<OtherEntity> otherEntities;
}
这意味着我无法将新的其他实体分配给MainClass并保持两者。我必须做两个单独的操作才能完成任务。但是,当我们重构模式时,这将消失。
或者,我们可以为其他两个表创建实体,以使操作更加透明。