这个问题与我在这个问题上遇到的问题有关,但不完全相同:
如何避免 NullPointerException 与父实体类的 OneToOne 映射?
如果我像这样指定我的映射,则创建 OneToOne 映射似乎可以正常工作:
Person + PersonPartDeux
|
+--User
但是,如果我在以下位置更改辅助实体的名称,它将不起作用OneToOne
:
Person + DersonPartDeux (note the D)
|
+--User
在这种情况下,我收到一个错误:
java.lang.NullPointerException
at org.hibernate.cfg.OneToOneSecondPass.doSecondPass(OneToOneSecondPass.java:135)
我为本示例选择的名称非常糟糕,但我的原始代码中的虚假名称较少,OneToOne
映射到与原始实体完全不同的名称。
我调试了 Hibernate-Annotations 源,我看到它personPartDeux
被正确映射为属性(在 中OneToOneSecondPass.java
),但如果实体/属性名称为dersonPartDeux
.
这个属性没有被映射的原因是什么?
有没有办法覆盖这种行为(例如,在其中一个注释中指定连接列名称或实体名称)?
我正在使用 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;
}
如果我替换这两个类,我会得到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;
}