2017-01-24 164 views
0

我在使用DiscriminatorColumn時從數據庫加載表時遇到了問題。就實體擴展我的超類(ObjectA)而言,數據加載沒有問題。新值出現在沒有表擴展名的鑑別器列中時發生問題。我試圖加載ObjctA的鑑別值不同於它在註解中指定的(ObjectTypes.GENERIC_OBJECT)。因爲我正在使用IngeritanceType.JOINED我知道應該有一個帶有id的子表來連接這些表,但是沒有這樣的表。我也不能添加它(需求)。休眠繼承問題


我想要做的是加載ObjectA類的鑑別值不同於註釋中指定的。我知道價值只接受一個價值。我還嘗試創建擴展ObjectA的空類,並將dicriminator值設置爲期望值。沒有成功。 Hibernate把它當作實體並且找不到它。

有沒有針對該場景的解決方法?


我的實體是這樣的:

@MappedSuperclass 
public abstract class AbstractEntity implements Serializable 
{... 

@Entity 
@Table(name = "objecta") 
@Inheritance(strategy = InheritanceType.JOINED) 
@DiscriminatorColumn(name = "objectclass", discriminatorType = DiscriminatorType.INTEGER) 
@DiscriminatorValue(ObjectTypes.GENERIC_OBJECT) 
@NamedQueries({...}) 
public class ObjectA extends AbstractEntity { 
... 

@Entity 
@Table(name = "objectb") 
@DiscriminatorValue(ObjectTypes.OBJECT_B) 
@NamedQueries({...}) 
public class ObjectB extends ObjectA{ 

public class ObjectTypes{ 
    public static final String GENERIC_OBJECT = "0"; 
    public static final String OBJECT_B= "1"; 
    public static final String OBJECT_C = "2";//no extension table for that object type, 
//it is the same as GENERI_OBJECT (no additional properties) 
    public static final String OBJECT_C = "3"; 
...} 

(編輯)問題:

我不能執行原生查詢加載對象A的對象(但我可以加載它,當對象A作爲子對象擴展裝載):

@NamedQueries({ @NamedQuery(name = ObjectA.FIND_BY_ID, query = "SELECT t FROM ObjectA t WHERE t.id = :id"), 
     @NamedQuery(name = ObjectA.FIND_ALL, query = "SELECT t FROM ObjectA t"), 
     @NamedQuery(name = ObjectA.TOTAL_RESULT, query = "SELECT count(t) from ObjectA t"), 
     @NamedQuery(name = ObjectA.FIND_BY_OBJECT_TYPE, query = "SELECT t FROM ObjectA t WHERE t.objecttype = :objectType") }) 
public class ObjectA extends AbstractEntity { 

    private static final long serialVersionUID = 8831394270398606926L; 
    public static final String FIND_BY_ID = "ObjectA.find"; 
    public static final String FIND_ALL = "ObjectA.findAll"; 
... 

//loading part 
    public List<ObjectA> findByObjectType(ObjectTypes objectType) { 
     return em.createNamedQuery(ObjectA.FIND_BY_OBJECT_TYPE, ObjectA.class).setParameter("objectType", objectType).getResultList(); 
    } 

堆棧跟蹤:

Caused by: javax.persistence.PersistenceException: org.hibernate.type.SerializationException: could not deserialize 
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1692) 
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1602) 
    at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:492) 
    at com.mypackage.repository.ObjectARepository.findAll(ObjectARepository.java:38) 
    at com.mypackage.database.DatabaseManager.init(DatabaseManager.java:77) 
    ... 240 more 
Caused by: org.hibernate.type.SerializationException: could not deserialize 
    at org.hibernate.internal.util.SerializationHelper.doDeserialize(SerializationHelper.java:243) 
    at org.hibernate.internal.util.SerializationHelper.deserialize(SerializationHelper.java:287) 
    at org.hibernate.type.descriptor.java.SerializableTypeDescriptor.fromBytes(SerializableTypeDescriptor.java:138) 
    at org.hibernate.type.descriptor.java.SerializableTypeDescriptor.wrap(SerializableTypeDescriptor.java:113) 
    at org.hibernate.type.descriptor.java.SerializableTypeDescriptor.wrap(SerializableTypeDescriptor.java:27) 
    at org.hibernate.type.descriptor.sql.VarbinaryTypeDescriptor$2.doExtract(VarbinaryTypeDescriptor.java:60) 
    at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:47) 
    at org.hibernate.type.descriptor.converter.AttributeConverterSqlTypeDescriptorAdapter$2.extract(AttributeConverterSqlTypeDescriptorAdapter.java:121) 
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:238) 
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:234) 
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:224) 
    at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:300) 
    at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2738) 
    at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1729) 
    at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1655) 
    at org.hibernate.loader.Loader.getRow(Loader.java:1544) 
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:727) 
    at org.hibernate.loader.Loader.processResultSet(Loader.java:972) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:930) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:336) 
    at org.hibernate.loader.Loader.doList(Loader.java:2617) 
    at org.hibernate.loader.Loader.doList(Loader.java:2600) 
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2429) 
    at org.hibernate.loader.Loader.list(Loader.java:2424) 
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:501) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:371) 
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216) 
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1326) 
    at org.hibernate.internal.QueryImpl.list(QueryImpl.java:87) 
    at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:606) 
    at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:483) 
    ... 242 more 
Caused by: java.io.StreamCorruptedException: invalid stream header: 7B227363 
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:806) 
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299) 
    at org.hibernate.internal.util.SerializationHelper$CustomObjectInputStream.<init>(SerializationHelper.java:309) 
    at org.hibernate.internal.util.SerializationHelper$CustomObjectInputStream.<init>(SerializationHelper.java:299) 
    at org.hibernate.internal.util.SerializationHelper.doDeserialize(SerializationHelper.java:218) 
    ... 272 more 
+0

objectType如何映射?似乎問題與反序列化結果中的某些東西有關,也許你的列中有一列?顯示相關映射(變量) – Tobb

+0

它由'javax.persistence'轉換器映射。但這不是問題。異常是由不同的ObjectA屬性中的無效'jasonb'轉換引發的。感謝您的幫助Tobb。下面的答案幫了我很多。 – AndreyB

回答

0

當使用InheritanceType.JOINED沒有必要對DiscriminatorColumn(這是爲SINGLE_TABLE繼承)。

InheritanceType.JOINED,你需要在你的子類中的以下內容:

@PrimaryKeyJoinColumn(name = "parent_id", referencedColumnName = "id") 

爲你的子類的表然後將需要的列parent_id,這既是primary key的表,該列的foreign keyid(主鍵)對應於超類的表中。

+0

好吧,我刪除了'DiscriminatorColumn'並添加了@ @ PrimaryKey..',它沒有它。但我的主要問題仍然存在。當我試圖執行本機查詢來獲取一些ObjectA對象時,我得到了反序列化異常'無效流頭...'。你知道一個原因嗎? ObjectA可以從數據庫作爲父對象加載,但不能單獨加載。 – AndreyB

+0

將查詢和異常添加到您的問題。 – Tobb