次のシンプルなデザインがあります。
(ソース: kawoolutions.com )
これは基本的に、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;
...
}
Player と Coach のエンティティ クラスはほとんど同じです。
ここでの問題は、2 つの双方向の関連付け (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
古い学校の JPA 1.0 マッピングに切り替えると、すべて正常に動作します。Hibernate は上記のマッピングに問題があるようです。
私は他にもたくさんの問題レポートを見てきました。実際、hibernate.org のフォーラムには同様の未解決の問題がたくさんありますが、なぜこれが例外をスローするのかについての手がかりは見つかりませんでした。
私には、Hibernate のバグのようです。誰でもこれを確認できますか?(私はHibernate 3.6を使用していることに注意してください)