簡體   English   中英

休眠繼承問題

[英]Hibernate inheritance issue

使用DiscriminatorColumn時,從數據庫加載表時出現問題。 就實體擴展我的超類(ObjectA)而言,數據加載沒有問題。 當新值出現在不具有表擴展名的鑒別符列中時,發生了問題。 我正在嘗試使用與在注釋(ObjectTypes.GENERIC_OBJECT)中指定的區別值不同的ObjctA加載。 由於我使用的是IngeritanceType.JOINED,因此我知道應該有一個帶有ID的子表來聯接這些表,但是沒有這樣的表。 我也不能添加它(要求)。


我正在嘗試做的是使用與批注中指定的區別值不同的ObjectA類加載。 我知道Value只接受一個值。 我還嘗試創建擴展ObjectA的空類,並將區分值設置為所需的值。 沒有成功 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";
...}

問題:

我無法通過執行本機查詢來加載ObjectA對象(但是當ObjectA作為子對象擴展名加載時,我可以加載它):

@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

當使用InheritanceType.JOINED ,不需要DiscriminatorColumn (這意味着SINGLE_TABLE繼承)。

對於InheritanceType.JOINED ,您的子類中將需要以下內容:

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

然后,您的子類的表將需要有一個parent_id列,它既是表的primary key ,又是表中與超類相對應的列id (主鍵)的foreign key

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM