尽管您应该始终拥有数据库驱动模式演变 http://vladmihalcea.com/high-performance-java-persistence-chapter-8-why-jpa-and-hibernate-matter/并使用FlywayDB迁移架构版本,您可以根据需要覆盖@Index。
我添加了一个在 GitHub 上测试 https://github.com/vladmihalcea/hibernate-master-class/blob/master/core/src/test/java/com/vladmihalcea/hibernate/masterclass/laboratory/mapping/IndexOverrideTest.java来证明这一点。
这些类看起来像这样:
@Entity(name = "Base")
@Table(name="Base")
@Inheritance(strategy = InheritanceType.JOINED)
public static abstract class Base {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Transient
protected String x;
public Long getId() {
return id;
}
public String getX() {
return x;
}
public void setX(String x) {
this.x = x;
}
}
@Entity(name = "ChildY")
@Table(name="ChildY")
@DiscriminatorValue("Y")
public static class ChildY extends Base {
private String y;
@Override
@org.hibernate.annotations.Index(name = "xy")
@Access(AccessType.PROPERTY)
public String getX() {
return x;
}
}
@Entity(name = "ChildZ")
@Table(name="ChildZ")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorValue("Z")
public static class ChildZ extends Base {
private String z;
@Override
@org.hibernate.annotations.Index(name = "xz")
@Access(AccessType.PROPERTY)
public String getX() {
return x;
}
}
架构是这样生成的:
create table Base (id bigint generated by default as identity (start with 1), primary key (id))
create table ChildY (x varchar(255), y varchar(255), id bigint not null, primary key (id))
create table ChildZ (x varchar(255), z varchar(255), id bigint not null, primary key (id))
create index xy on ChildY (x)
create index xz on ChildZ (x)
这边走:
- 您在域模型中保留基类属性(字段、getter 和 setter)
- 每张桌子都有自己的
x
具有关联索引的列
问题是你不能在基类中拥有该字段,因为 Hibernate 将尝试创建它两次。您可以在 Hibernate 上提交 Jira 问题,并提及 HBM 模式生成应跳过索引(如果已创建)。
最优雅的解决方案是简单地使用适当的数据库模式并删除 HBM-DDL 模式生成。