当前位置: 首页 > 知识库问答 >
问题:

Hibernate/JPA 2.0@OneToOne关系可能不存在匹配行

邢飞雨
2023-03-14

我有两个表,比方说Person和Person_Info。两个表都有共享的PKPERSON_ID,该PKPERSON_ID也用作外键。情况是,可以存在不存在Person_Info的Person_Info。Person_info对于person是可选的,不需要存在具有相同PERSON_ID的行。当我要搜索具有hibernate的人员时,例如:

Criteria criteria = session.createCriteria(Person.class);
criteria.add(Restrictions.eq("name", name));
Object obj = criteria.uniqueResult();

我有个例外:

 [<package>.PersonInfo#338664] org.hibernate.ObjectNotFoundException: No row with the given identifier exists:  <package>.PersonInfo#338664]

当然,带有person_id=338664的Person_info行并不存在。但我还是希望hibernate能够处理这件事。如果行存在,那么我想加载它,如果它不存在,我想得到空,而不是一个异常。

我使用的是hibernate版本3.5.6-final。我认为这个线程完全是关于同样的问题,但是在它的@PrimaryKeyJoinColumn中没有带有双向@OneToOne关系的解决方案

谢谢你的帮助。

注释后的类是这样的:

Person类:

@Entity
@Table(name="Person")
public class Person extends BaseDBEntity<Integer>{
    private PersonInfo personInfo;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="person_id")
    public Integer getId() {
      return id;
    }

    @OneToOne(cascade = CascadeType.ALL, optional = true)
    @PrimaryKeyJoinColumn
    public PersonInfo getPersonInfo() {
      return personInfo;
    }
}

PersonInfo类:

@Entity
@Table(name="Person_info")
public class PersonInfo extends BaseDBEntity<Integer> {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="person_id")
    public Integer getId() {
      return id;
    }
}  

它们都继承自BaseDbEntity:

public abstract class BaseDbEntity<T> implements Serializable {

      private static final long serialVersionUID = 1L;

      protected T id;
}

共有1个答案

叶茂才
2023-03-14

这是已知的错误:HHH-4982(@PrimaryKeyJoinColumn不支持JPA OneToOne(optional=true))。

问题可以通过更新到较新的版本来解决。Bug在3.6.8中已经修复,但如果不支持Hibernate4,那么更新到3.6.10可能是有意义的。

 类似资料:
  • 问题内容: 我有两个具有双向@OneToOne映射的类。 我需要编写代码来检索B的所有实例,这些实例没有与之关联的A实例。我还需要为所有没有B的A编写类似的查询。 我努力了: 但这似乎总是返回null。有什么想法吗? 问题答案: 这对两个方向都应该起作用:

  • 我正在开发应用程序来学习PostgreSQL上的HiberNate。我目前正在尝试将变量添加到具有OneToOne关系的数据库中。 首先,我用下面的模式在数据库中创建了两个表。在表上,它有主键,也是表的外键。 然后我创建了两个类,和。是具有OneToOne关系的的子类。我使用下面的代码添加作为属性的。 但是上面代码的问题是HiberNate首先执行子查询,而不是父查询。 Hibernate:在pe

  • 问题内容: 我在尝试使用PostgreSQL和Hibernate时遇到一些问题,更具体地说,是标题中提到的问题。我已经在网上搜索了几个小时,但没有找到适合我的解决方案。 我正在为Web开发人员使用Eclipse Java EE IDE。在Ubuntu 9.10上使用HibernateTools,Hibernate 3,PostgreSQL 8.4.3构建ID:20090920-1017 以下是相关

  • 我有和。他们有一个不可撤销的关系。 如何查询具有空的所有对象? 因为如果我这样做: JPA引擎在两个表之间进行连接,并放置一个无用的WHERE子句()。恢复时,它会执行一个无用的本机SQL。怎么能 当前解决方案: 阅读OpenJPA文档时,我发现应该使用本机查询来解决JPA的限制。我可以很容易地使用本机查询,我目前正在这样做,但我想避免使用它。

  • 创建一个Android项目“MyApp” 导入ActionBarSherlock(ABS)、DirectionalViewPager(DVP)或任何其他使用android支持库的开源库。 将库添加到项目“MyApp” 我知道我应该从libs文件夹中删除android-support-v4.jar,并且只保留一个副本。但是,这并没有解决我的问题。 当我试图从MyApp中删除android-suppo

  • 问题内容: 它是有效申报,并在关系的双方,如: 我找不到任何表明这是无效的信息,但似乎在持久性过程中,至少必须违反关系的一侧。(例如,如果首先写入changeEntry,则changeEntryDetails临时为null)。 尝试此操作时,我看到抛出了异常。 我想避免在可能的情况下放宽约束,因为双方都 必须 存在。 问题答案: 声明并在关系的两边是否合法(…)我找不到任何表明无效的内容,但是在持