0

Java EE 7,休眠 5.4.21.Final

为什么SubClass继承SuperClass @UniqueConstraint注解,或者更具体地说,为什么 Hibernate在表映射SuperClass期间使用注解?SubClass

如何@UniqueConstraint在子类中覆盖?

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Table( name = "supTable",
        uniqueConstraints = {
            @UniqueConstraint(  name = "UK_multi_col",
                                columnNames = {"colOne", "colTwo"})
        }
)
public class SuperClass implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    @Column(name = "id", unique = true, nullable = false)
    protected Long id;

    @Column(name = "colOne")
    protected Long colOne;

    @Column(name = "colTwo")
    protected Long colTwo;
    ...
}

使用相同的名称"UK_multi_col"in@UniqueConstraint不会覆盖 in并在表中SubClass生成两个 UNIQUE KEY 。SubClass一个唯一键来自SuperClass和一个来自SubClass,其中应该只有一个(不包括主键)。

@Entity
@Table( name = "subTable",
        uniqueConstraints = {
            @UniqueConstraint(  name = "UK_multi_col",
                                columnNames = {"colOne", "colTwo", "colThree"})
        }
)
public class SubClass extends SuperClass {

    @Column(name = "colThree")
    protected Long colThree;
    ...
}

Hibernate 生成的代码:

create table test_subTable (
   id bigint not null,
    colOne bigint,
    colTwo bigint,
    colThree bigint,
    primary key (id)
) engine=InnoDB

create table test_supTable (
   id bigint not null,
    colOne bigint,
    colTwo bigint,
    primary key (id)
) engine=InnoDB

alter table test_subTable
    drop index UK_multi_col    
alter table test_subTable
    add constraint UK_multi_col unique (colOne, colTwo, colThree)

接下来的四行是映射SuperClass期间注释生成的代码:SubClass

alter table test_subTable
    drop index UK_a5tjgjgpmww7otw30iyvmym1m    
alter table test_subTable
    add constraint UK_a5tjgjgpmww7otw30iyvmym1m unique (colOne, colTwo) 

继续休眠生成的代码:

alter table test_supTable
    drop index UK_multi_col
alter table test_supTable
    add constraint UK_multi_col unique (colOne, colTwo)

数据库表:

| test_subtable | CREATE TABLE `test_subtable` (
  `id` bigint(20) NOT NULL,
  `colOne` bigint(20) DEFAULT NULL,
  `colTwo` bigint(20) DEFAULT NULL,
  `colThree` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `UK_multi_col` (`colOne`,`colTwo`,`colThree`),
  UNIQUE KEY `UK_a5tjgjgpmww7otw30iyvmym1m` (`colOne`,`colTwo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

| test_suptable | CREATE TABLE `test_suptable` (
  `id` bigint(20) NOT NULL,
  `colOne` bigint(20) DEFAULT NULL,
  `colTwo` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `UK_multi_col` (`colOne`,`colTwo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

有没有人可以解决这个问题?

这是一个休眠错误吗?

4

1 回答 1

0

经过一天的搜索和测试,它看起来像是一个 Hibernate 错误,使用 EclipseLink 进行测试会产生正确的数据库映射。我已经向hibernate提交了一个错误报告

请参阅:HHH-14234以了解测试用例、EclipseLink 项目文件和问题状态。

如果有人遇到该问题的良好解决方案,请发布。

更新:看起来该错误已修复,请参阅: https ://github.com/hibernate/hibernate-orm/pull/3574

更新:这个问题将在 Hibernate 版本 5.5.0 中修复

于 2020-09-28T02:54:20.480 回答