【问题标题】:Migration to Hibernate 4, @Inheritance and @GeneratedValue misunderstandings迁移到 Hibernate 4,@Inheritance 和 @GeneratedValue 的误解
【发布时间】:2012-06-18 19:47:00
【问题描述】:

我升级了我的网络应用程序以使用 Hibernate 4。之后我遇到了一些问题,我需要帮助。

我的域对象有一个基类,如下所示:

@MappedSuperclass 
public class BaseDomainObject implements Serializable {

    @Id
    @GeneratedValue
    @Column
    protected Integer id;

    public Integer getId() {
            return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
}

然后,我有很多实体,像这样:

@Entity
@Table(name="[user]")
public class User extends BaseDomainObject {

    @Column(name="first_name")
    private String      firstName;
    @Column(name="last_name")
    private String      lastName;

    ....
}

我在实体之间有一些继承:

@Entity
@Table(name="record_data")
@Polymorphism(type=PolymorphismType.EXPLICIT)
public class RecordData extends BaseDomainObject {
    ....
}


@Entity
@Table(name="auto_data")
@Polymorphism(type=PolymorphismType.EXPLICIT)
public class AutoData extends RecordData {

}

当我进行 hql 查询时,我得到了这个异常

 Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Invalid column name 'DTYPE'.

在hibernate源代码中,我看到如果实体的父类hibernate默认设置为SINGLE_TABLE继承,所以在每个查询中它连接DiscriminatorColumn,但我没有鉴别器列,因为每个类都映射到不同的表。

为了解决这个问题,我把这个注释放在我的实体上:

@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 

但在那之后我得到了另一个例外

Caused by: org.hibernate.MappingException: Cannot use identity column key generation with <union-subclass> mapping for: bla.bla.RecordData

我在网上找到了解决方案。它需要将我的 BaseDomainObject 中的 @GeneratedValue 策略更改为 TABLE

@GeneratedValue(strategy=GenerationType.TABLE)

但这导致了另一个异常

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name 'hibernate_sequences'.

我的数据库中的所有表都有一个自动增量 id..所以我不希望 hibernate 来管理它..

我错过了什么吗?

【问题讨论】:

  • 谢谢!解决了我的问题是我的 hib 5 annot jpa 映射类做了一些干扰,但总是每个都有自己的表/没有鉴别器...... InheritanceType.TABLE_PER_CLASS

标签: java inheritance orm hibernate-annotations hibernate-4.x


【解决方案1】:

一些解释:

Caused by: org.hibernate.MappingException: Cannot use identity column
key generation with <union-subclass> mapping for: bla.bla.RecordData

原因是,如果您在多个表中继承了实体,则无法使用标识列生成键(因为这可能会在不同列中生成相同的键)。试想一下,如果您尝试检索查询中的所有 BaseDomainObjects,则不可能以这种方式拥有不冲突的主键。

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name
'hibernate_sequences'.

您已将 ID 生成策略设置为 TABLE,但由于某种原因,hibernate 没有创建表来存储这些 ID。您需要手动创建它或找出为什么 hibernate 没有在启动时创建它。

一些建议:

  • Identity 列和继承并不像您尝试过的那样好用。您应该尝试@Inheritance(strategy=InheritanceType.JOINED),因为这会为基类创建一个带有标识列的表,并将其余属性存储在其他表中。

  • 如果上述方法失败,请使用序列,通过指定 @GeneratedValue(strategy=GenerationType.SEQUENCE)

【讨论】:

  • JOINED 不是解决方案。使用 SEQUENCE 我得到“com.softrunner.init.SrtSQLServerDialect 不支持序列”.. 所以我知道我应该回滚到 Hibernate 3..
  • 可能为时已晚,但“JOINED”有什么问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-06
  • 2016-01-17
  • 2016-06-25
  • 1970-01-01
  • 2015-12-18
  • 2017-07-10
相关资源
最近更新 更多