2012-06-15 25 views
2

我升級了我的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 ..所以我不想要冬眠會管理它..

我想念什麼?

回答

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(策略= GenerationType.SEQUENCE)

+0

JOINED不是解決辦法。使用SEQUENCE我得到「com.softrunner.init.SrtSQLServerDialect不支持序列」..所以我明白我應該回滾到Hibernate 3 .. –

+0

可能太晚了,但「JOINED」有什麼問題? – Swapnil