2012-07-16 76 views
1

我有這樣的關係:JPA註釋錯誤與OneToOne和複合主鍵

+------------------+ +----------------+ +----------+ 
| TTR_AUT   | | TTR_ANO_ESCALA | | TTR_POA | 
+------------------+ +----------------+ +----------+ 
|#ID_ESCAL   | |#ID_ESCAL  | |#ID_ESCAL | 
|#ANO    |----|#ANO   |----|#ANO  | 
|#MES    | | NOMBRE   | |#MES  | 
| OBSERVACIONES | +----------------+ | VALOR | 
+------------------+       +----------+ 

TTR_AUT和TTR_POA具有oneToOne關係。現在我不會從POA中獲得一個帶有VALOR的Aut對象。隨着未來實體:

實體Aut.java

@Entity 
@Table(name="TTR_AUT") 
public class Aut implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @EmbeddedId 
    private AutPK id; 

    @Column(name="OBSERVACIONES") 
    private String observaciones; 

    @OneToOne 
    @JoinTable(name="TTR_POA", 
     joinColumns = { 
      @JoinColumn(name="ANO", insertable=false, updatable=false, referencedColumnName="ANO"), 
      @JoinColumn(name="ID_ESCAL", insertable=false, updatable=false, referencedColumnName="ID_ESCAL"), 
      @JoinColumn(name="MES", insertable=false, updatable=false, referencedColumnName="MES")   
     }, 
     inverseJoinColumns = { 
      @JoinColumn(name="ANO", insertable=false, updatable=false, referencedColumnName="ANO"), 
      @JoinColumn(name="ID_ESCAL", insertable=false, updatable=false, referencedColumnName="ID_ESCAL"), 
      @JoinColumn(name="MES", insertable=false, updatable=false, referencedColumnName="MES") 
     }  
    ) 
    private Poa poa; 

    public Aut() { 
    } 

    //GETTERS AND SETTERS 
} 

實體AutPK.java

@Embeddable 
public class AutPK implements Serializable { 
    //default serial version id, required for serializable classes. 
    private static final long serialVersionUID = 1L; 

    @Column(name="ID_ESCAL", unique=true, nullable=false, precision=22) 
    private Long idEscal; 

    @Column(name="ANO", unique=true, nullable=false, precision=22) 
    private Long ano; 

    @Column(name="MES", unique=true, nullable=false, precision=22) 
    private Long mes; 

    public AutPK() { 
    } 

    //GETTERS AND SETTERS 
} 

實體Poa.java

@Entity 
@Table(name="TTR_POA") 
public class Poa implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @EmbeddedId 
    private PoaPK id; 

    @Column(name="VALOR", precision=22) 
    private BigDecimal valor; 

    public Poa() { 
    } 

    //GETTERS AND SETTERS 
} 

實體PoaPK.java

@Embeddable 
public class PoaPK implements Serializable { 
    //default serial version id, required for serializable classes. 
    private static final long serialVersionUID = 1L; 

    @Column(name="ID_ESCAL", unique=true, nullable=false, precision=22) 
    private Long idEscal; 

    @Column(unique=true, nullable=false, precision=22) 
    private Long ano; 

    @Column(unique=true, nullable=false, precision=22) 
    private Long mes; 

    public PoaPK() { 
    } 

    //GETTERS AND SETTERS 
} 

當我獲得對象早熟,它拋出這個錯誤:

]] Root cause of ServletException. 
java.lang.IllegalArgumentException: org.hibernate.TypeMismatchException: Provided id of the wrong type for class es.model.entities.Poa. Expected: class es.model.entities.PoaPK, got class es.model.entities.AutPK 
    at org.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.java:314) 
    at es.model.entities.dao.impl.AutDAOImpl.getAutDeterminada(AutDAOImpl.java:25) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    Truncated. see log file for complete stacktrace 
Caused By: org.hibernate.TypeMismatchException: Provided id of the wrong type for class es.model.entities.Poa. Expected: class es.model.entities.PoaPK, got class es.model.entities.AutPK 
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:132) 
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1079) 
    at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:1006) 
    at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:613) 
    at org.hibernate.type.EntityType.resolve(EntityType.java:441) 
    Truncated. see log file for complete stacktrace 

什麼問題/錯誤?

回答

0

也許你需要爲PoaPK和AutPK定義不同的serialVersionUID。 將PoaPK的serialVersionUID更改爲2或除1之外的任何其他數字。

+0

謝謝,但這個答案不起作用。錯誤是等於。 – earnaz 2012-07-16 11:33:21

1

我認爲原因是您的可嵌入類是相同的。我沒有看到PoaPK和AutPK之間的區別,如果您只是使用相同的嵌入式類,那麼該怎麼辦?如果這不起作用,你也可以嘗試composite ID

+0

謝謝!我已經嘗試使用一個可嵌入類爲兩個,我得到的錯誤ORA-00918.With複合ID它的作品,但我不能改變這個老闆的任務 – earnaz 2012-07-16 12:16:57