1

この質問は、私がこの質問で抱えていた問題に関連していますが、同一ではありません:

親エンティティ クラスに対する OneToOne マッピングで NullPointerException を回避するにはどうすればよいですか?

次のようにマッピングを指定すると、OneToOne マッピングの作成はうまくいくようです。

Person + PersonPartDeux
  |
  +--User

ただし、次のセカンダリ エンティティの名前を変更すると機能しませんOneToOne

Person + DersonPartDeux (note the D)
  |
  +--User

この場合、エラーが発生します。

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

この例で選んだ名前は非常に悪いものですが、元のコードには偽の名前が少なくOneToOne、元のエンティティとは完全に異なる名前にマッピングされています。

personPartDeuxHibernate-Annotations ソースをデバッグしたところ、がプロパティとして適切にマップされていることがわかります ( 内OneToOneSecondPass.java) が、エンティティ/プロパティ名が の場合、エンティティのプロパティとして表示されませんdersonPartDeux

このプロパティがマップされない理由は何ですか?

この動作をオーバーライドする方法はありますか (例: 結合列名、または注釈の 1 つでエンティティ名を指定するなど)?

Hibernate 3.2.4.sp1 と Hibernate Annotations 3.2.1.GA を使用していますが、現在アップグレードできません。

動作するコードは次のとおりです。

@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="personPartDeux")
    public Person person;

    public String someText;
}

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

これら 2 つのクラスを置き換えると、NullPointerException上で参照した I が得られます。

@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 DersonPartDeux dersonPartDeux; // Note D in entity/field name
}

@Entity
public class DersonPartDeux 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="dersonPartDeux") // Note the d in the property name
    public Person person;

    public String someText;
}
4

1 に答える 1

0

プロジェクト環境で、エンティティクラスを?にリストする必要がありますpersistence.xmlか?<class>おそらく、要素の名前を変更するのを忘れたのでしょう。

于 2012-10-04T04:58:09.047 に答える