如何通过针对父实体类的OneToOne映射来避免NullPointerException?

时间:2012-10-02 00:34:11

标签: java hibernate nullpointerexception one-to-one

我搜索并发现了类似的问题,但它们似乎与

相同。

我有一些像这样映射的实体:

Person
  |
  +--User

我想添加一个新实体PersonPartDeux,其中OneToOne映射到Person。生成的映射应如下所示:

Person + PersonPartDeux
  |
  +--User

当我这样做时,在尝试加载映射时会抛出NullPointerException

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映射来解决我的应用程序中的不同已知问题。

1 个答案:

答案 0 :(得分:0)

将Hibernate源附加到项目中,以便您可以单击直通或“打开类型”(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 dosc的一个例子,可能更好地展示了如何做你想做的事情:

@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个文档。)

干杯,希望这会有所帮助。