3

次のシンプルなデザインがあります。

有効な XHTML
(ソース: 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を使用していることに注意してください)

4

3 に答える 3

13

この問題は、 persistence.xmlでエンティティクラスを宣言するのを忘れた場合に発生する可能性があります。

于 2012-03-28T11:35:50.010 に答える
0

ひどいバグ。私が言ったように、EclipseLinkには問題はありません。ここでバグレポートを表示します(そして投票します):

http://opensource.atlassian.com/projects/hibernate/browse/HHH-5695

于 2011-05-02T11:47:36.953 に答える
0

アノテーションクラスの参照プロパティ名とセッターゲッターメソッド名が同じであることを確認してください例:私は1対1の関係を持つ2つのクラスCatとDogを持っています

猫クラスで

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;
    }
}
于 2014-10-14T06:44:11.833 に答える