Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过对父实体类的OneToOne映射避免NullPointerException?_Java_Hibernate_Nullpointerexception_One To One - Fatal编程技术网

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

Java 如何通过对父实体类的OneToOne映射避免NullPointerException?,java,hibernate,nullpointerexception,one-to-one,Java,Hibernate,Nullpointerexception,One To One,我已经搜索并发现了类似的问题,但它们似乎与我们的问题并不完全相同 我有几个实体映射如下: Person | +--User Person + PersonPartDeux | +--User 我想添加一个新实体PersonPartDeux,该实体具有到Person的OneToOne映射。生成的映射应如下所示: Person | +--User Person + PersonPartDeux | +--User 执行此操作时,在尝试加载映射时会

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

我有几个实体映射如下:

Person
  |
  +--User
Person + PersonPartDeux
  |
  +--User
我想添加一个新实体
PersonPartDeux
,该实体具有到
Person
的OneToOne映射。生成的映射应如下所示:

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

将Hibernate源代码附加到您的项目中,这样您就可以单击thru或“Open Type”(Eclipse中的Ctrl-Shift-T)来查看OneToOneSecondPass源代码

查看来源,将为您提供关于需要指定内容的明确指示

在我的源代码(Hibernate 4.1.7)中,第135行是

propertyHolder.addProperty( prop, inferredData.getDeclaringClass() );
但是,您可能正在使用早期版本

看看这些映射,我怀疑@OneToOne的定义--mappedBy=“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;
}
资料来源: (JBoss网站外的3.5个文档)


干杯,希望这有帮助。

-我有一个共享主键,这个答案声称除非我做这个映射,否则它不起作用。是的,我使用的是Seam 2.0.1.GA附带的Hibernate版本,我现在真的无法升级:)关于这个映射你是对的。将
mappedBy=“person”
更改为
mappedBy=“personPartDeux”
为我的示例解决了这个问题。不幸的是,这并不是我真正的代码中的问题,所以我将不得不进一步挖掘,以获得我问题的真实再现。我将在另一个问题中这样做,因为你回答了我在这里问的问题。