2015-10-15 66 views
0

因此,我習慣於使用帶註釋的Hibernate 4一段時間了。傳統上,我每桌完成1個具體課,完成並完成,這一直對我有效。休眠單表,查詢所有行

現在,我仍然在使用Hibernate 4.3.11,並且第一次使用Single Table Hierarchy。我有一個主/根類,如下所示:

@Entity 
@Table(name = "mytable") 
@SuppressWarnings("serial") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = "myobject_type", discriminatorType = DiscriminatorType.STRING) 
@DiscriminatorValue(value = "ABC") 
public class MyEntity extends BaseEntity 

所以,我在想,如果這個類應該是抽象類???它似乎並不需要。

子類的定義如下:

@Entity 
@DiscriminatorValue(value = "XYZ") 
public class XyzEntity extends MyEntity 

我創建了一個DAO的myEntity所,以及這些方法的單元測試,創建/更新/ findById一切似乎工作......但「getAllList」不似乎。

@Override 
public List<MyEntity> getAllList() 
{ 
    List<MyEntity> myList = this.sessionFactory.getCurrentSession().createQuery("from MyEntity").list(); 
    return myList; 
} 

當我單元測試此方法時,我收到一條錯誤消息。

org.hibernate.WrongClassException: Object [id=708] was not of the specified subclass [com.myapp.server.model.common.MyEntity] : Discriminator: XYZ 

我應該說我有4條記錄在數據庫中。 2個記錄在「myobject_type」字段中的值爲「XYZ」,另一個值爲「ABC」

所以,我想知道是否應該打擾我的根類中有DiscriminatorValue?我讓該字段「myobject_type」不爲空,因此,我會確保每個記錄都有一個來自MyEntity的記錄的鑑別器值「ABC」,如果創建了XyzEntity,則會記錄「XYZ」的值。同樣,一個新的MnoEntity在該領域的價值可能是「MNO」。

只是好奇,在這整個層次結構中,如果我有兩個MyEntity的子類,我可以在這兩個子實體中具有相同的字段嗎?或者,我想我可以將類似這樣的東西移動到根實體的不止一個地方。

同樣,這是我第一次使用Hibernate中的Single Table Hierarchy,我只需要解決這個錯誤消息。非常感激任何的幫助!!!謝謝!

湯姆

+0

你看過嗎? http://stackoverflow.com/questions/25349239/hibernate-single-table-inheritance – javaguest

+0

是的。我在這個問題上進行了大量的搜索,並且我看了幾十頁關於SIngle表層次結構的正確示例。一些例子表明,基類/實體不必是抽象的,而且我當然可以讓這個類抽象化,問題就會消失。但是,如果我正在開發的應用程序需要這個根類,我只想知道我是否可以解決這個問題? – tjholmes66

+0

在我發佈的問題中,用戶創建了另一個帶有insertable = false,updateable = false的抽象類,所以你仍然可以使用你的根類 – javaguest

回答

0

試圖直接做SQL查詢過濾這一價值觀在查詢創建的,而不是做這與@DiscriminatorColumn和@DiscriminatorValue。

List<MyEntity> myList = this.sessionFactory.getCurrentSession().createQuery("from MyEntity where myobject_type != :pattern").setParameter("pattern", pattern).list(); 
return myList;