我升级了我的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,但我没有鉴别器列,因为每个类都映射到不同的表。
为了解决这个问题,我把这个注释放在我的实体上:
@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会管理它..
我错过了什么吗?
答案 0 :(得分:0)
一些解释:
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在启动时没有创建它的原因。
一些建议:
您尝试过,标识列和继承效果不佳。您可能会尝试使用@Inheritance(strategy = InheritanceType.JOINED),因为这会为具有标识列的基类创建一个表,并将其余属性存储在其他表中。
如果上述操作失败,请使用序列,指定@GeneratedValue(strategy = GenerationType.SEQUENCE)