【问题标题】:Hibernate one-to-one, No row with the given identifier exists exception一对一休眠,没有给定标识符的行存在异常
【发布时间】:2012-02-08 23:49:15
【问题描述】:

我需要两个实体之间的链接,所以我使用一对一

@Entity
@Table(name = "T_USER")
public class User implements Serializable {

    @Id
    @Column(name = "user_id")
    private int userId;

    @Column(name = "login")
    private String login;

    @OneToOne(optional = true)    
    @JoinColumn(name="login", referencedColumnName="person_id", nullable = true, insertable = false, updatable = false)
    private Person person;
}

@Entity
@Table(name = "T_PERSON")
public class Person implements Serializable {
    @Id
    @Column(name = "person_id")
    private String personId;

    @Column(name = "pin")
    private String pin;
}

如果表 T_USER 中没有特定 PERSON 的项目,user.getPerson 会抛出异常:

org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [packagename.com.entity.Person#scabriou]

但如果我在 db 中的 2 个表之间有引用,则 getter 有效!

【问题讨论】:

  • 您的问题究竟是什么?
  • 如果用户表 person 中没有引用,我不想在调用 user.getPerson 时出现异常。我需要检查 user.getPerson 是否不为 null 我想要 user.getPerson().getPin()。
  • 它是一对一的,不在主键上。
  • 这不是一对一的主键。您在 T_USER 表中有一个外键(登录名),它引用了人员 ID。此列中的值是否不是现有人员 ID?
  • 尝试将参数“fetch=FetchType.LAZY”添加到用户的@OneToOne 注释

标签: java hibernate exception one-to-one


【解决方案1】:

我不能说这是否是最佳解决方案,但您可以使用 @NotFound 注释。例如

@NotFound(action = NotFoundAction.IGNORE)
private Person person;

我相信人会保持null并且不会抛出异常。

【讨论】:

  • 哇,谢谢,我从未见过那些注释。有用!现在,它是最好的解决方案......?通常,我知道在主键上使用一对一会更好,但在这种情况下,我将使用 @NotFound 注释的另一种方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多