之前一直用多对一,即使是一对一也转换成多对一方式解决。今天逃不了要用一对一还是费了点功夫才搞定。
多对一关联关系的配置上,在两边分配配置多对一和一对多就行了。但是一对一的时候,两边都是@OneToOne,那么这个外键究竟会放到哪个表里面呢?当然,在实际意义来说,放在哪个表里面都合理。但是在Hibernate的配置上就应该是确定在某一张表的。在JPA的官方文档中有这样的说明:
mappedBy
public abstract java.lang.String mappedBy
(Optional) The field that owns the relationship. This element is only specified on the inverse (non-owning) side of the association.
意思是说,哪一方是inverse就配置mappedBy就行了,这样,外键就产生在了非inverse一方对应的表里了。
以员工(Employee)和薪酬信息(SalaryInfo)为例说明,这里希望外键产生在薪酬信息表里面:
员工:
@Entity
@Table(name = "core_employee")
public class Employee {
private SalaryInfo salaryInfo;
@OneToOne(mappedBy="empNo")
public SalaryInfo getSalaryInfo() {
return salaryInfo;
}
...
}
薪酬信息:
@Entity
@Table(name = "sal_salary_info")
public class SalaryInfo {
private Employee emp;
@OneToOne(cascade=CascadeType.ALL,targetEntity=Employee.class)
@JoinColumn(name = "emp_no", nullable = false)
public Employee getEmp() {
return this.emp;
}
...
}
另外,在Hibernate的Criteria的查询中,不支持复杂对象的比较,比如下面的代码:
Criteria criteria = getSession().createCriteria(Employee.class);
criteria.add(Restrictions.isNull("salaryInfo"));
意图查询没有薪酬信息的员工,结果在执行查询的时候,将产生下面的语句:
select *
from employee emp
inner join salaryinfo s on s.emp_no=emp.emp_no
where emp.emp_no is null
很是奇怪为啥条件是emp.emp_no is null。应该写成下面的形式:
Criteria criteria = getSession().createCriteria(Employee.class);
criteria.add(Restrictions.isNotNull("salaryInfo.id"));
除了isNotNull,其他的所有方法都是同样的道理,在进行复杂类型属性比较的时候需要点到里面的属性才会触发生成正确的sql查询条件。
上面的代码到现在这个时候还无法正确查询到结果。因为Criteria的默认表连接方式为inner join,这样的连接方式导致没有找到薪酬信息的员工记录也无法出现在查询结果中。需要显示声明表连接方式:
Criteria criteria = getSession().createCriteria(Employee.class);
criteria.add(Restrictions.isNotNull("salaryInfo.id",JoinType.LEFT_OUTER_JOIN));
分享到:
相关推荐
在Java的持久化框架Hibernate中,一对一(One-to-One)关联是对象关系映射(ORM)中的一个重要概念。这种关联关系意味着一个实体最多只能与另一个实体的实例进行关联,反之亦然。本示例将深入讲解如何在Hibernate中...
在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是常见的关系映射类型之一。它用于表示两个实体之间一对一的关联关系,即一个实体对应另一个实体的唯一实例。下面将详细介绍Hibernate中如何进行一对一...
在Java的持久化框架Hibernate中,一对一(One-to-One)关联是一种常见的关系映射方式,它表示两个实体之间存在唯一的对应关系。这种关系通常出现在两个实体之间具有唯一性的关联,例如一个人与他的护照,或者一个...
在Java的持久化框架Hibernate中,一对一(One-to-One)映射是一种常见关系映射,用于表示两个实体之间一对一的关联。本篇文章将详细探讨Hibernate中实现一对一映射的两种方式,并结合源码分析其原理。 一、主键外键...
"Hibernate one-to-many / many-to-one关系映射"是两个基本的关系类型,用于表示实体间的关联。在这个主题中,我们将深入探讨这两种关系映射的原理、配置和实际应用。 一、一对一(one-to-one)与一对多(one-to-...
在Hibernate中,一对一唯一外键关联映射可以通过 `<many-to-one>` 标签来配置。例如,以下是Person实体与IdCard实体的一对一唯一外键关联映射配置: ```xml <many-to-one name="idCard" column="card_id...
标题"Hibernate one to many(many to one) 配置"涉及到的是关系型数据库在Java中的持久化框架Hibernate中的两种关联映射关系:一对一(One-to-One)和多对一(Many-to-One)。在数据库设计中,这种关系很常见,例如...
在Java的持久化框架Hibernate中,"Many-to-One"关系是一种常见的关联映射类型,它表示一个实体(类)可以与多个其他实体实例相关联。在这个主题中,我们将深入探讨Hibernate如何处理这种关系,以及如何在实际编程中...
本话题主要探讨两种基本的关系映射类型:many-to-one(多对一)和one-to-many(一对多)。这两种关系映射是数据库中常见的关联类型,理解和掌握它们对于开发高质量的Java应用至关重要。 1. many-to-one关系 many-to...
【Hibernate应用例子one-to-one】 Hibernate 是一个强大的Java对象关系映射(ORM)框架,它允许开发者以面向对象的方式操作数据库,从而简化了数据库应用程序的开发。在Hibernate中,"one-to-one"(一对一)关联是...
在Java的持久化框架Hibernate中,一对一(One-to-One)关系映射是一种常见的实体关联方式。基于外键的One-to-One映射是其中的一种实现方式,它通过在一方或双方实体的表中添加外键来建立关联。接下来,我们将深入...
在配置双向一对多关联时,我们通常在"多"一端(这里是`Student`)的集合属性上使用`<many-to-one>`标签,将`Classes`对象映射到数据库中的外键。同时,在"一"端(`Classes`)使用`<set>`标签,表示班级可以包含多个...
在Java持久化框架Hibernate中,`one_to_many`映射是一种常见的关系模型,它表示一个实体(类)可以与多个其他实体(类)关联。在这个关系中,一个实体(通常是"one"端)对应多个实体实例("many"端)。在数据库中,...
在Hibernate中,`one-to-many`关系是常见的实体间关系之一,表示一个实体可以与多个其他实体相关联。本文将深入探讨`Hibernate one-to-many`注解的使用和实现细节。 ### 一、`@OneToMany`注解概述 `@OneToMany`...
hibernate:one-to-one 的学习小经验
在Java的持久化框架Hibernate中,一对一(One-to-One)关联是对象关系映射(ORM)中的一个重要概念,它用于表示两个实体之间一对一的映射关系。本篇将深入探讨Hibernate 3.2中的一对一关系,以及如何在实际项目中...
### Hibernate Many-to-One (多对一) 及 Cascade (级联) #### 一、Many-to-One(多对一) 在数据库设计中,实体之间的关系主要包括一对一、一对多、多对多等几种类型。而在ORM(对象关系映射)框架Hibernate中,...
`hibernate_one_to_one`标签表示我们将探讨的是如何在Hibernate中实现一对一的映射关系。 **二、一对一映射的两种类型** 1. **主键关联(Primary Key Join)**:两个实体共享同一个主键,这通常意味着它们是同一个...
本篇文章将深入探讨Hibernate中的关联映射,特别是One-to-One(一对一)关联,这是一种表示两个实体之间一对一关系的映射方式。我们将通过源码分析和实际例子来理解其工作原理。 ### 一、One-to-One关联概述 在...
NULL 博文链接:https://zhangyulong.iteye.com/blog/856191