gpt4 book ai didi

java - 在 Hibernate 的父类(super class)上使用索引注释

转载 作者:行者123 更新时间:2023-12-04 10:34:39 25 4
gpt4 key购买 nike

我有一个抽象父类(super class),我域中的每个实体都是它的子类。

使用 DB 模式生成,我想为每个实体创建一个索引,在父类(super class)的一个字段上,而不是在每个子类上使用 Table 注释。

我的父类(super class)

    @MappedSuperclass
public abstract class BaseEntity {

@Id
@GeneratedValue(strategy = SEQUENCE)
private Long surrogateId;

@Index(name="id_index") // Every subclass should inherit this index, with its own name
@Column(unique = true, updatable = false, nullable = false)
private UUID id = UUID.randomUUID();

子类的一个例子

    @Entity
public class Customer extends BaseEntity {
...
}

我到目前为止尝试过:
  • 使用 在父类(super class)上使用 @Index 进行注释,但 Hibernate
    如果没有用@Entity 标记,似乎不会使用该注释。
    例如@Table(indexes = {@Index(name="index_id", columnList = "id")})不生成 SQL 语句。
  • 使用 弃用 @Index 带有名称“id_index”的注释,但只有一个索引
    在启动时创建(数据库引发错误,该索引已经
    存在于其他实体)。一些生成的 SQL 语句:
  •     Hibernate: create index id_index on "customer" ("id")

    Hibernate: create index id_index on "user" ("id")

    2020-02-15 17:47:26,620 WARN o.hibernate.tool.schema.internal.ExceptionHandlerLoggedImpl - GenerationTarget encountered exception accepting command : Error executing DDL "create index id_index on "customer" ("id")" via JDBC Statement
    org.postgresql.util.PSQLException: ERROR: relation "id_index" already exists

    关于如何在没有太多代码重复的情况下做到这一点的任何想法?

    谢谢

    最佳答案

    我可以看到这样做的唯一方法 - 看起来比简单地避免放置 @Table 更麻烦。每个实体上的注释 - 是创建自定义方言并覆盖 getIndexExporter()方法:

    public class MyPostgreSQLDialect extends PostgreSQLXXDialect{

    @Override
    public Exporter<Index> getIndexExporter() {
    return new MyIndexExporter(this);
    }
    }

    返回自定义的导出器,很可能扩展 org.hibernate.tool.schema.internal.StandardIndexExporter
    public class MyIndexExporter extends StandardIndexExporter{

    public MyIndexExporter(Dialect dialect){
    super(dialect);
    }

    @Override
    public String[] getSqlCreateStrings(Index index, Metadata metadata) {
    //looks like you'd need to paste the whole code from superclass method
    //and alter the index name accordingly

    indexNameForCreation = index.getTable().getQualifiedTableName() +
    "_" + index.getName();

    //in the default implementation it is simply index.getName()
    }
    }

    关于java - 在 Hibernate 的父类(super class)上使用索引注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60241400/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com