Hibernate:AnnotationException:未知的mappedBy in ...在反向(mappedBy)上引用属性unknown,双向@OneToOne关联

Kaw*_*awu 2 mapping hibernate jpa bidirectional one-to-one

我有以下简单的设计:

有效的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;

    ...
}
Run Code Online (Sandbox Code Playgroud)

Player和Coach实体类几乎完全相同.

这里的问题是两个双向关联(mappedBy).这些映射与EclipseLink完美配合,但Hibernate以某种方式使用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
Run Code Online (Sandbox Code Playgroud)

当切换到老派JPA 1.0映射时,所有运行都很好.Hibernate似乎在上面的映射中遇到了问题.

我已经看了很多其他的问题报告,事实上hibernate.org上的论坛充满了类似的未解决的问题,但是我找不到任何关于为什么会引发异常的线索.

对我来说,这似乎是一个Hibernate错误.任何人都可以证实吗?(注意我正在使用Hibernate 3.6)

小智 11

如果我们忘记在persistence.xml中声明实体类,则会遇到此问题.