2011-01-14 66 views
2

所有。JPA一對多關聯到具有@Inheritance的實體(strategy = InheritanceType.JOINED)

我想這樣的關聯映射一個一對多到是mappes與@Inheritance(strategy=InheritanceType.JOINED)

.... 
@ManyToMany 
@JoinTable(name = "S_MC_CC_CONTRATTIRAPPORTI", 
    joinColumns = @JoinColumn(name = "COD_MULTICHANNELID"), 
    inverseJoinColumns = @JoinColumn(name = "COD_RAPPORTO") 
) 
private Collection<Rapporto> rapporti; 
... 

@Entity 
@Table(name = "S_MC_CC_RAPPORTI") 
@Inheritance(strategy=InheritanceType.JOINED) 
@DiscriminatorColumn(name="COD_TIPORAPPORTO") 
public abstract class Rapporto implements Serializable { 

問題的實體是我收到此異常 異常說明:缺少類指標字段值[1]類型[class java.lang.String]。

我認爲JPA試圖找出該類的DiscriminatorValue。 我想加載所有擴展超類的對象。

可能嗎?

更多信息:這是聯想

@Entity 
@Table(name = "S_MC_CC_CONTRATTI") 
public class Contratto implements Serializable { 

    @Id 
    @Column(name = "COD_MULTICHANNELID") 
    private String multichannelId; 

    @ManyToMany() 
    @JoinTable(name = "S_MC_CC_CONTRATTIRAPPORTI", joinColumns = @JoinColumn(name = "COD_MULTICHANNELID"), inverseJoinColumns = @JoinColumn(name = "COD_RAPPORTO")) 
    private Collection<Rapporto> rapporti; 

的主人這是抽象類的許多-to-many關聯

@Entity 
@Table(name = "S_MC_CC_RAPPORTI") 
@Inheritance(strategy=InheritanceType.JOINED) 
@DiscriminatorColumn(name="COD_TIPORAPPORTO") 
public abstract class Rapporto implements Serializable { 

    private static final long serialVersionUID = -5567166522882040440L; 

    @Id 
    @Column(name = "COD_RAPPORTO") 
    protected Long codiceRapporto; 

而且這是兩個子類:

@Entity 
@Table(name="S_MC_CC_CCCLIENTI") 
@DiscriminatorValue("1 ") 
public class ContoCorrente extends Rapporto { 
    private static final long serialVersionUID = -3380622649760983262L; 

    @Column(name = "DESC_DIVISA") 
    private String divisa; 

@Entity 
@Table(name = "S_MC_CC_RAPPORTI") 
@DiscriminatorValue("6 ") 
public class NumeroPortafoglioEstero extends Rapporto { 

    private static final long serialVersionUID = 6869743707936663970L; 

    /** 
    * @param filiale 
    * @param categoria 
    * @param conto 
    */ 
    public NumeroPortafoglioEstero(Filiale filiale, String categoria, String conto) { 
     super(filiale, categoria, conto); 
    } 

這是個例外:

Local Exception Stack: 
Exception [EclipseLink-43] (Eclipse Persistence Services - 2.1.2.v20101206-r8635): org.eclipse.persistence.exceptions.DescriptorException 
Exception Description: Missing class for indicator field value [1] of type [class java.lang.String]. 
Descriptor: RelationalDescriptor(it.alten.intesasanpaolo.contratto.domain.core.rapporto.Rapporto --> [DatabaseTable(S_MC_CC_RAPPORTI)]) 
    at org.eclipse.persistence.exceptions.DescriptorException.missingClassForIndicatorFieldValue(DescriptorException.java:921) 
    at org.eclipse.persistence.descriptors.InheritancePolicy.classFromValue(InheritancePolicy.java:355) 
    at org.eclipse.persistence.descriptors.InheritancePolicy.classFromRow(InheritancePolicy.java:342) 
    at org.eclipse.persistence.descriptors.InheritancePolicy.selectAllRowUsingDefaultMultipleTableSubclassRead(InheritancePolicy.java:1303) 
    at org.eclipse.persistence.descriptors.InheritancePolicy.selectAllRowUsingMultipleTableSubclassRead(InheritancePolicy.java:1402) 
    at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRows(ExpressionQueryMechanism.java:2493) 
    at org.eclipse.persistence.queries.ReadAllQuery.executeObjectLevelReadQuery(ReadAllQuery.java:407) 
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeDatabaseQuery(ObjectLevelReadQuery.java:1076) 
    at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:740) 
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1036) 
    at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:380) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.internalExecuteQuery(AbstractSession.java:2392) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1291) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1273) 
    at org.eclipse.persistence.internal.indirection.QueryBasedValueHolder.instantiate(QueryBasedValueHolder.java:96) 
    at org.eclipse.persistence.internal.indirection.QueryBasedValueHolder.instantiate(QueryBasedValueHolder.java:86) 
    at org.eclipse.persistence.internal.indirection.DatabaseValueHolder.getValue(DatabaseValueHolder.java:83) 
    at org.eclipse.persistence.internal.indirection.UnitOfWorkValueHolder.instantiateImpl(UnitOfWorkValueHolder.java:160) 
    at org.eclipse.persistence.internal.indirection.UnitOfWorkValueHolder.instantiate(UnitOfWorkValueHolder.java:220) 
    at org.eclipse.persistence.internal.indirection.DatabaseValueHolder.getValue(DatabaseValueHolder.java:83) 
    at org.eclipse.persistence.indirection.IndirectList.buildDelegate(IndirectList.java:237) 
    at org.eclipse.persistence.indirection.IndirectList.getDelegate(IndirectList.java:398) 
    at org.eclipse.persistence.indirection.IndirectList.toArray(IndirectList.java:741) 
    at it.alten.intesasanpaolo.contratto.domain.core.anagrafica.Contratto.toString(Contratto.java:262) 
    at java.lang.String.valueOf(String.java:2827) 
    at java.io.PrintStream.println(PrintStream.java:771) 
    at it.alten.intesasanpaolo.contratto.dao.core.anagrafica.TestContrattoDaoJpaImpl.testGetItemByID(TestContrattoDaoJpaImpl.java:99) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
    at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

親切的問候 馬西莫

+0

您使用哪個JPA提供程序? – axtavt 2011-01-14 17:35:46

+0

Eclipselink 2.1.2 – 2011-01-14 17:48:47

回答

3

繼承層次結構中每個實體必須是標註了@Entity一類,具有@DiscriminatorValue

+0

好吧,我做到了。問題是與超級類的關聯是抽象的,沒有DiscriminatorValue。想象一下人 - >動物,其中動物是由貓和狗延伸的抽象超類。貓和狗有歧視者的價值,但動物不是。現在我想聯繫從人到動物,並擁有所有的貓和狗。我需要這樣的東西:targetEntity = {Cat.class,Dog.class}但不支持。任何想法?親切的問候 – 2011-01-14 17:35:44

3

根據文件資料的EclipseLink(see),此異常發生時,在繼承層次結構中找不到具有特定鑑別符值的類。

請注意,錯誤消息顯示鑑別值爲1,而在@DiscriminatorValue中,它指定爲"1 "。我認爲這個額外的空間會導致一個問題 - 當從數據庫加載數據時,這個空間會被剝離,或者數據庫中的舊值有沒有空格的判別器。

1

我更改了@DiscriminatorValue:現在超類定義:@DiscriminatorColumn(name="COD_TIPORAPPORTO", discriminatorType=DiscriminatorType.STRING, length=2)
和親屬子類:
@DiscriminatorValue("1")
現在,我不再收到任何異常,但所產生的查詢來獲得數據不起作用:這裏是會產生什麼樣的例子:

[EL Fine]: 2011-01-14 19:29:53.312--ServerSession(5230193)--Connection(5612344)--Thread(Thread[main,5,main])--SELECT t0.COD_RAPPORTO, t0.COD_TIPORAPPORTO, t0.COD_MATRICOLAGESTORE, t0.FLAG_RENDICONTAZIONE, t0.COD_CATEGORIA, t0.COD_STATORAPPORTO, t0.FLAG_SB_ATTIVO, t0.COD_GESTORE, t0.TIMESTAMP_AGGIORNAMENTO, t0.DESC_ATTRIBUTO, t0.NUM_RAPPORTO, t0.COD_NSG, t0.COD_ABI, t0.DEN_FILIALE, t1.COD_RAPPORTO, t1.COD_CIN, t1.DESC_DIVISA, t1.COD_CAB, t1.COD_IBAN, t1.COD_CHD, t1.COD_NAZIONE, t1.COD_SERVIZIO FROM S_MC_CC_RAPPORTI t0, S_MC_CC_CONTRATTIRAPPORTI t2, S_MC_CC_CCCLIENTI t1 WHERE (((t2.COD_MULTICHANNELID = ?) AND (t0.COD_RAPPORTO = t2.COD_RAPPORTO)) AND ((t1.COD_RAPPORTO = t0.COD_RAPPORTO) AND (t0.COD_TIPORAPPORTO = ?))) 

綁定=>【01025640171576493,1]

在影響通過Toad發佈的查詢工作正常。似乎加載所有數據的查詢正在工作,但實際上我看不到該關聯值。

親切的問候給所有...

相關問題