gpt4 book ai didi

java - 迁移到 Hibernate 4、@Inheritance 和 @GenerateValue 的误解

转载 作者:行者123 更新时间:2023-12-02 07:37:36 25 4
gpt4 key购买 nike

我升级了我的 Web 应用程序以使用 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,但我没有discriminator列,因为每个类都映射到不同的表。

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

@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 

但在那之后我又得到了另一个异常(exception)

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

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

@GeneratedValue(strategy=GenerationType.TABLE)

但这导致了另一个异常

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

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

我错过了什么吗?

最佳答案

一些解释:

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

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

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

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

一些建议:

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

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

关于java - 迁移到 Hibernate 4、@Inheritance 和 @GenerateValue 的误解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11055767/

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