首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >H2索引名唯一性

H2索引名唯一性
EN

Stack Overflow用户
提问于 2015-08-25 08:21:01
回答 1查看 2.1K关注 0票数 6

对于h2数据库中索引名称的唯一性,我有一个小问题。使用mysql/mariadb,可以同时为表A和表B定义名为"X“的索引。对于h2数据库,这是不可能的,因为每个数据库的索引名称应该是唯一的。

这对我来说是个问题,因为我有一个基本的JPA实体类,定义了以下属性:

代码语言:javascript
复制
@org.hibernate.annotations.Index(name = "X")
protected String x;

它由A类和B类继承,B类的索引创建失败,错误如下:

代码语言:javascript
复制
ERROR [main] o.h.tool.hbm2ddl.SchemaUpdate   - HHH000388: Unsuccessful: create index X on B(x)
ERROR [main] o.h.tool.hbm2ddl.SchemaUpdate   - Index "X" already exists

是否可以告诉hibernate自动创建索引名,或者以某种方式为H2创建一个适配器,该适配器将在此类索引名称的前面加上表名?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-13 18:34:42

尽管您应该始终拥有数据库驱动模式演化并使用FlywayDB迁移架构版本,但您可以根据需要覆盖@Index。

我添加了一个GitHub测试来证明这一点。

这些课程如下所示:

代码语言:javascript
复制
@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;
    }
}

模式的生成方式如下:

代码语言:javascript
复制
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)

这条路:

  1. 在域模型中保留基类属性(字段、getter和setter)
  2. 每个表都使用关联的索引获取自己的x列。

问题是您不能在基类中使用该字段,因为Hibernate将尝试创建它两次。您可以在Hibernate上提交一个Jira问题,并提到如果已经创建了HBM模式生成,则应该跳过索引。

最优雅的解决方案是简单地使用适当的数据库模式并删除HBM模式生成。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32198962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档