1

同様の問題を検索して見つけましたが、同じ問題ではないようです

次のようにマッピングされたエンティティがいくつかあります。

Person
  |
  +--User

PersonPartDeuxにOneToOne マッピングを持つ新しいエンティティを追加したいと考えていPersonます。結果のマッピングは次のようになります。

Person + PersonPartDeux
  |
  +--User

そうすると、NullPointerExceptionマッピングをロードしようとしているときに a がスローされます。

java.lang.NullPointerException
    at org.hibernate.cfg.OneToOneSecondPass.doSecondPass(OneToOneSecondPass.java:135)

この例外を回避できるようにマッピングを指定するにはどうすればよいですか?

これが私のコードです:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Person implements Serializable
{
    @Id
    @GeneratedValue
    public Long id;

    @Version
    public int version = 0;

    public String name;

    @OneToOne(cascade = CascadeType.ALL)
    @PrimaryKeyJoinColumn
    public PersonPartDeux personPartDeux;
}

@Entity
public class PersonPartDeux implements Serializable
{
    @Id
    @GeneratedValue(generator = "person-primarykey")
    @GenericGenerator(
        name = "person-primarykey",
        strategy = "foreign",
        parameters = @Parameter(name = "property", value = "person")
    )
    public Long id = null;

    @Version
    public int version = 0;

    @OneToOne(optional=false, mappedBy="person")
    public Person person;

    public String someText;
}

@Entity
@PrimaryKeyJoinColumn(name = "person_Id")
public class User extends Person
{
    public String username;
    public String password;
}

OneToOneなぜ面倒なのかというと、アプリケーションのさまざまな既知の問題を解決するには、継承とマッピングの両方が必要です。

4

1 に答える 1

0

Hibernateソースをプロジェクトにアタッチして、Thruまたは「OpenType」(EclipseではCtrl-Shift-T)をクリックしてOneToOneSecondPassソースを表示できるようにします。

ソースを見ると、何を指定する必要があるかが明確に示されます。

私のソース(Hibernate 4.1.7)では、135行目は

propertyHolder.addProperty( prop, inferredData.getDeclaringClass() );

ただし、おそらく以前のバージョンを使用しています。

マッピングを見ると、@OneToOneの定義--mappedBy="person"が疑わしいです。

@OneToOne(optional=false, mappedBy="person")
public Person person;

アソシエーションプロパティを単独でマップすることは、どのような意味がありますか?Hibernateは、プロパティがOneToOneであることをすでに知っています。

プロパティの基盤となるマッピング/FKを指すこと自体は、おそらく実際にはHibernateに正しい情報や有用な情報を伝えているわけではありません。

これはHBドキュメントの例で、おそらくあなたが望むことを行うためのより良い方法を示しています:

@Entity
class MedicalHistory implements Serializable {
  @Id Integer id;

  @MapsId @OneToOne
  @JoinColumn(name = "patient_id")
  Person patient;
}

@Entity
class Person {
  @Id @GeneratedValue Integer id;
}

出典: http ://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/ (JBossサイトから3.5ドキュメント)

乾杯、これがお役に立てば幸いです。

于 2012-10-02T02:39:40.200 に答える