java - 当链接实体名称不是从父实体名称派生时,如何避免使用 OneToOne 映射出现 NullPointerException?

标签 java hibernate nullpointerexception one-to-one

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

How do I avoid NullPointerException with OneToOne mapping against a parent entity class?

如果我像这样指定我的映射,创建 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:

@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;
}

最佳答案

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

关于java - 当链接实体名称不是从父实体名称派生时,如何避免使用 OneToOne 映射出现 NullPointerException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12717352/

上一篇:java - 比较值

下一篇:Java 错误蜂鸣声

相关文章:

java - 如何提高应用程序的性能

java - 背景图像帮助,JPanel,JFrame,什么?

java - 在 Java 中评估 SQL 表达式?

mysql - 在没有 native 查询的情况下在 JPA 中更新

EditText 上的android random NullPointerException

android - findViewById 为 WebView 返回 null

java - 使用 Selenium 的多浏览器环境中的 GUI

java - 使用 Jama 库进行矩阵乘法

java - 找出二叉树的直径

java - JPA PessimisticLockScope.NORMAL 和锁定 "relationships"