1

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

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

Person
  |
  +--User

我想添加一个PersonPartDeux具有 OneToOne 映射的新实体到Person. 生成的映射应如下所示:

Person + PersonPartDeux
  |
  +--User

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

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

4

1 回答 1

0

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

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

于 2012-10-02T02:39:40.200 回答