1

这个问题与我在这个问题上遇到的问题有关,但不完全相同:

如何避免 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;
}
4

1 回答 1

0

在您的项目环境中,您是否需要在 ? 中列出实体类persistence.xml?也许您忘记更改<class>元素的名称。

于 2012-10-04T04:58:09.047 回答