2017-01-24 8 views
0

DiscriminatorColumn을 사용하는 동안 데이터베이스에서 테이블을로드하는 데 문제가 있습니다. 객체가 내 상위 클래스 (ObjectA)를 확장하는 한 데이터로드에는 문제가 없습니다. 테이블 확장이없는 discriminator 열에 새 값이 나타난 경우 문제가 발생했습니다. 주석 (ObjectTypes.GENERIC_OBJECT)에 지정된 것보다 다른 식별자 값으로 ObjctA를로드하려고합니다. IngeritanceType.JOINED를 사용할 것이므로이 테이블을 조인 할 id가있는 자식 테이블이 있어야한다는 것을 알고 있지만 그러한 테이블은 없습니다. 나는 그것도 추가 할 수 없다 (요구 사항).최대 절전 모드 상속 문제


내가하고자하는 것은 주석에 지정된 것 이외의 판별 자 값으로 ObjectA 클래스를로드하는 것입니다. 나는 Value가 단지 하나의 값만을 받아 들인다는 것을 안다. 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"; 
...} 

(편집) 문제 :

내가 네이티브 쿼리를 실행하여 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 
+0

objectType은 어떻게 매핑됩니까? 문제가 결과에서 무언가를 비 직렬화하는 것과 관련이있는 것 같습니다. 관련 매핑 (변수) 표시 – Tobb

+0

이것은 javax.persistence 변환기로 매핑됩니다. 하지만 그건 문제가 아닙니다. 다른 ObjectA 속성에서 잘못된 'jasonb'변환으로 인해 예외가 발생합니다. 도와 주셔서 고맙습니다. 아래의 당신의 대답은 많은 도움이되었습니다. – AndreyB

답변

0

DiscriminatorColumn 필요 (이 SINGLE_TABLE 상속 의미)이 없도록 InheritanceType.JOINED를 사용하여.

InheritanceType.JOINED를 들어, 하위 클래스에 다음이 필요합니다

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

하위 클래스의 테이블은 두 테이블의 primary key하는 열 parent_id, 및 열에 대한 foreign key이 필요합니다 슈퍼 클래스에 해당하는 테이블의 id (기본 키)

+0

좋아요, 나는 DiscriminatorColumn을 삭제하고'@ PrimaryKey..'를 추가했고 그것 없이는 작동합니다. 그러나 중요한 문제는 남아 있습니다. deserialization Exception'invalid stream header ...'를 얻는 ObjectA 객체를 얻기 위해 기본 쿼리를 실행하려고 할 때. 그 이유를 아십니까? ObjectA는 db에서 부모로로드 될 수 있지만 단독으로로드 될 수는 없습니다. – AndreyB

+0

질문에 쿼리와 예외를 추가하십시오. – Tobb