2011-04-29 66 views
2

我有以下簡單的設計:休眠:AnnotationException:未知的mappedBy在...引用屬性上的反向(的mappedBy)未知,雙向@OneToOne協會

Valid XHTML http://www.kawoolutions.com/media/persons-roles-reduced.png

這基本上非解決方法 - JPA不支持的分離繼承。人可以自己存在,但可以選擇單個玩家實體,單個教練實體或兩個實體來完成邏輯。

這裏是比較容易理解的JPA 2.0映射(注意@Id正向關聯):

@Entity 
@Table(name = "Persons") 
public class Person implements Serializable 
{ 
    @Id 
    @Column(name = "id") 
    private Integer id; 

    @Column(name = "first_name") 
    private String firstName; 

    @Column(name = "last_name") 
    private String lastName; 

    @OneToOne(mappedBy = "person") 
    private Coach coach = null; 

    @OneToOne(mappedBy = "person") 
    private Player player = null; 

    ... 
} 

@Entity 
@Table(name = "Players") 
public class Player implements Serializable 
{ 
    @Column(name = "registration_nbr") 
    private String registrationNbr = null; 

    @Id 
    @OneToOne 
    @JoinColumn(name = "id") 
    private Person person = null; 

    ... 
} 

@Entity 
@Table(name = "Coaches") 
public class Coach implements Serializable 
{ 
    @Column(name = "license_nbr") 
    private String licenseNbr = null; 

    @Id 
    @OneToOne 
    @JoinColumn(name = "id") 
    private Person person = null; 

    ... 
} 

的球員和教練的實體類幾乎是相同的。

這裏的問題是兩個雙向關聯(mappedBy)。這些映射與EclipseLink的完美,但不知何故休眠與AnnotationException怪胎:

Exception in thread "main" javax.persistence.PersistenceException: [PersistenceUnit: persons] Unable to configure EntityManagerFactory 
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:374) 
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:48) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32) 
    at tld.persons.Main.main(Main.java:32) 
Caused by: org.hibernate.AnnotationException: Unknown mappedBy in: tld.persons.model.Person.coach, referenced property unknown: tld.persons.model.Coach.person 
    at org.hibernate.cfg.OneToOneSecondPass.doSecondPass(OneToOneSecondPass.java:159) 
    at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1686) 
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1393) 
    at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1345) 
    at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1477) 
    at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:193) 
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:1096) 
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:278) 
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:362) 
    ... 4 more 

當切換到老派JPA 1.0映射所有再次運行正常。 Hibernate似乎有上述映射的問題。

我看了很多其他的問題報告,其實在hibernate.org上的論壇充滿了類似的未解決的問題,但我找不到任何線索爲什麼會引發異常。

對我來說,它似乎是一個Hibernate的bug。任何人都可以證實這一點? (注意我使用休眠3.6)

回答

9

如果我們忘了申報的persistence.xml實體類的問題都可以遇到。

+0

謝謝,這有幫助! – 2013-11-30 00:51:39

0

確保在註記類的參考屬性名稱和setter getter方法名稱應該是相同的 例如: 我有兩個類新貓有狗一對一的關係

在貓類

class Cat {           
private Dog doggy; 

    @OneToOne(fetch = FetchType.LAZY) 
    @PrimaryKeyJoinColumn 
    public Dog getdoggy() { 
     return this.doggy; 
    } 
    public void setdoggy(Dog doggy) { 
     this.doggy= doggy; 
    } 
} 

in Dog class 

class Dog { 

private Cat cat; 

    @OneToOne(fetch = FetchType.LAZY, mappedBy = "doggy") 
    public Cat getCat() { 
     return this.cat; 
    } 
    public void setCat(Cat cat) { 
     this.cat= cat; 
    } 
}