我升級了我的web應用程序以使用Hibernate 4.之後,我遇到了一些問題,我需要幫助。遷移到Hibernate 4,@Inheritance和@GeneratedValue的誤解
我有我的域對象的一個基類,看起來是這樣的:
@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源代碼,我看到,如果實體有父母冬眠穿上SINGLE_TABLE繼承默認情況下,所以在每次查詢它串聯DiscriminatorColumn,但我沒有鑑別列,因爲每個類映射到不同的表。
爲了解決這個問題,我把我的實體此註釋:
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
但在那之後我得到了另一個exeption
Caused by: org.hibernate.MappingException: Cannot use identity column key generation with <union-subclass> mapping for: bla.bla.RecordData
我發現在Web解決方案這一點。它需要在我BaseDomainObject改變@GeneratedValue的戰略,以表
@GeneratedValue(strategy=GenerationType.TABLE)
但這引起另一個異常
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name 'hibernate_sequences'.
在我的數據庫中的所有表有一個自動遞增ID ..所以我不想要冬眠會管理它..
我想念什麼?
JOINED不是解決辦法。使用SEQUENCE我得到「com.softrunner.init.SrtSQLServerDialect不支持序列」..所以我明白我應該回滾到Hibernate 3 .. –
可能太晚了,但「JOINED」有什麼問題? – Swapnil