この質問は、私がこの質問で抱えていた問題に関連していますが、同一ではありません:
親エンティティ クラスに対する 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
、元のエンティティとは完全に異なる名前にマッピングされています。
personPartDeux
Hibernate-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;
}