【问题标题】:How do I avoid NullPointerException with OneToOne mapping against a parent entity class?如何避免 NullPointerException 与父实体类的 OneToOne 映射?
【发布时间】:2012-10-02 00:34:11
【问题描述】:

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

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

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

【问题讨论】:

    标签: java hibernate nullpointerexception one-to-one


    【解决方案1】:

    将 Hibernate 源附加到您的项目,因此您可以单击 thru 或“打开类型”(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 个文档。)

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

    【讨论】:

    • stackoverflow.com/questions/787698/… - 我有一个共享主键,除非我进行此映射,否则此答案声称它不起作用。
    • 是的,我正在使用 Seam 2.0.1.GA 附带的 Hibernate 版本,我现在无法真正升级 :)
    • 你对那个映射是正确的。将mappedBy="person" 更改为mappedBy="personPartDeux" 解决了我的示例。不幸的是,这不是我的 real 代码中的问题,所以我将不得不进一步挖掘以真正重现我的问题。我会在另一个问题中这样做,因为您回答了我在这里提出的问题。
    猜你喜欢
    • 2012-08-04
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多