我试图优化我的数据库表.但是我对Hibernate/JPA缺乏了解并没有多大帮助.
我有一个Java对象模型,看起来或多或少像这样:
ParentClass
SubClass1
SubSubClass1
SubSubClass2
SubSubClass3
SubSubClass4
SubClass2
SubSubClass5
SubSubClass6
Run Code Online (Sandbox Code Playgroud)
所有类都包含Fields.大约50%的所有字段都在ParentClass中.40-50%属于SubClass1级别,0-10%属于SubSubclass级别.许多SubSubClass*类都是空的,但是需要用于标识Type.
尝试1:
所以.我们首先做的是在Parentclass上使用TABLE_PER_CLASS策略.这导致了大量的表:
SubSubClass1
SubSubClass2
SubSubClass3
SubSubClass4
SubSubClass5
SubSubClass6
Run Code Online (Sandbox Code Playgroud)
这不是很酷,因为这些表中所有列的50%在所有表之间共享,而其他Rest在3-4个表之间共享.
尝试2:
我们将策略更改为SINGLE_TABLE.
结果表只是一个大的"ParentClass"表.但由于所有列中只有大约50%在所有子类之间共享,因此许多字段必须设置为Null,这不是那么性感.
尝试3:
下一步尝试将TABLE_PER_CLASS策略与"SINGLE_TABLE"策略混合.我决定不使用JOIN TABLES作为策略,因为我必须使用许多小的子类,这会导致创建许多包含一个或两个Columns的小表.
所以,我在这个问题中回答了以下问题:如何将继承策略与JPA注释和Hibernate混合使用?
我现在想要将ParentClass中的所有值放在一个表中,将第一个SubLevel中的所有值放入一个表中.这应该导致这样的Schema:
ParentClass
- SubClass1
- SubClass2
- SubClass3
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
@MappedSuperclass
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class ParentClass {
private String value1;
}
@MappedSuperclass
@SecondaryTable(name = "SubClass1")
public abstract class SubClass1 extends ParentClass {
@Column(table = "SubClass1")
private String value11;
}
@MappedSuperclass
@SecondaryTable(name = "SubClass2")
public abstract class SubClass2 extends ParentClass { …Run Code Online (Sandbox Code Playgroud)