表Person
person_id 主键
person_name
passport_id 为外键,关联到表Passport
表Passport
passport_id 主键
country
serial
假设一个Person最多仅有一个Passport,
映射1对1关系
Person.hbm.xml
<many-to-one name="passport" unique="true" class="com.ding.hibernatetest.pojo.Passport" >
<column name="passport_id" length="32" />
</many-to-one>
Passport.hbm.xml
<one-to-one name="person" property-ref="passport" class="com.ding.hibernatetest.pojo.Person" >
</one-to-one>
现在把Passport给某个Person
public void addPassport2Person(String personId, String passportId) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Person person = (Person) session.load(Person.class, personId);
Passport passport = (Passport) session.load(Passport.class, passportId);
person.setPassport(passport);
session.getTransaction().commit();
}
我测试了两个数据:
测试1:
String personId = "8ac5061e160f87f001160f87f4740001";
String passportId = "8ac5061e160e694a01160e694dd30001";
test.addPassport2Person(personId, passportId);
测试2:
String personId = "ff8080811610085f0116100862c00001";
String passportId = "8ac5061e160e694a01160e694dd30001";
test.addPassport2Person(personId, passportId);
两个测试都正常完成,都是进行了一个select操作和一个update操作,
但是两个测试的passportId是一样的,这说明两个人共用一个护照,
这和Person.hbm.xml里设置的unique="true"不一致,而Hibernate也没有做检查,想来想去不知什么原因。(注:数据库中没有设置passport_id为unique,我想让Hibernate做检查。)
后来我又做了一个实验,在Person.hbm.xml里,设置person_name为unique
<property name="personName" type="java.lang.String" unique="true" >
<column name="person_name" length="20" unique="true" />
</property>
然后做插入操作,结果相同personName的人也都能插入数据库,Hibernate并没有做检查。
这让我很迷惑,后来查询Hibernate参考文档才明白什么原因。
Hibernate中unique的真正意义是根据hbm生成DDL时,如果设置了unique="true"则生成的表中对应的字段就有unique限制,而我是根据数据库的表生成的hbm,所以hbm中设置的unique="true"是没有任何用处的。
Hibernate不会因为你给这个属性或字段设置了unique为true就给你检查。我们必须让数据库来检查,然后抛出异常。
但是一般的验证流程是表述层-业务逻辑层-数据映射层-数据库,所以最好是提前检查。
分享到:
相关推荐
注意:在Hibernate3中,第二个要求并非是Hibernate强制必须的。但最好这样做。 你不能使用一个IdentifierGenerator产生组合关键字。一个应用程序必须分配它自己的标识符。 使用<composite-id> 标签(并且内嵌元素...
这种关系可以通过在映射配置中设置 unique="true" 来实现。 2. **一对多关系**:Student 类与 Classes 类之间是一对多的关系,Student 类有一个类型为 Set 的 classes 属性,表示一个学生可以属于多个班级。而 ...
在Java的持久化框架Hibernate中,一对一(One-to-One)关系映射是一种常见的实体关联方式。基于外键的One-to-One映射是其中的一种实现方式,它通过在一方或双方实体的表中添加外键来建立关联。接下来,我们将深入...
本文将深入探讨Hibernate中自动生成主键的几种常见策略及其应用场景。 ### 1. UUID.hex UUID(Universally Unique Identifier)是一种生成全局唯一标识符的方式,其长度为128位,通常表示为32个十六进制数字组成的...
Hibernate Search 是一个基于 Hibernate ORM 和 Apache Lucene 的开源项目,它提供了将 Hibernate 实体类自动索引到 Lucene 索引中的功能。通过这种方式,可以实现对实体数据的快速全文搜索,并且这些操作与普通的 ...
在Java的持久化框架Hibernate中,无主键表映射是一种特殊情况,主要处理那些在数据库中没有明确单一主键的表。这种情况通常出现在那些通过多个字段共同唯一标识一条记录的复合主键(Composite Key)场景。本文将详细...
在Java的持久化框架Hibernate中,一对多关系(OneToMany)是一种常见的对象关系映射(ORM)映射方式,它模拟了数据库中一个表的一条记录与另一表的多条记录之间的关联。本教程通过源代码的形式,讲解如何在Hibernate...
在Java的持久化框架Hibernate中,一对一(One-to-One)关联是对象关系映射(ORM)中的一个重要概念,它用于表示两个实体之间一对一的映射关系。本篇将深入探讨Hibernate 3.2中的一对一关系,以及如何在实际项目中...
它提供了多个可选参数,如name用于指定列名,unique用于设置唯一性约束,nullable定义是否允许空值,insertable和updatable控制列在INSERT和UPDATE语句中的行为,columnDefinition允许自定义SQL DDL片段,table指定...
在Java企业级开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它使得开发者可以使用面向对象的方式来处理数据库操作,而无需直接编写SQL语句。本篇将详细讲解如何在Hibernate中使用外键`ForeignKey`,...
1. 获取 hi 值:读取并记录数据库中 `hibernate_unique_key` 表中 `next_hi` 字段的值,并将该字段的值加 1 后保存回数据库。 2. 获取 lo 值:从 0 开始,一直到 max_lo 循环取值,步进为 1。当达到 max_lo 的值时,...
默认表名为`hibernate_unique_key`,列名为`next_hi`。主键生成通过以下步骤: - 获取Hi值:从数据库表中读取`next_hi`,加1后保存回表。 - 获取Lo值:在0到`max_lo`范围内循环取值。 - 通过公式`hi * (max_lo + ...
### Hibernate中的关联关系详解 #### 一、Hibernate一对一连接表单向关联 一对一连接表单向关联是指在数据库中通过一张连接表来实现两个表之间的关联,并且这种关联是单向的,即在一个实体中定义了另一个实体的...
在这个文档中,我们将深入探讨 Hibernate 4 中的一些基本注解,这些注解对于快速开发至关重要。 1. **@Entity**: 此注解标记一个Java类为实体类,表示这个类将被映射到数据库中的一个表。例如: ```java @Entity ...
在 Hibernate 中,一对一的外键单向关联意味着一个实体类中的属性指向另一个实体类,而另一个实体类并不知道这个关联。这种关联可以通过在 `many-to-one` 元素中添加 `unique="true"` 属性实现。例如,在 Person 类...
Hibernate,作为Java领域中的一款著名持久化框架,极大地简化了数据库操作,使得开发者能够更加专注于业务逻辑。本篇将基于提供的文件名,深入探讨Hibernate在对象关系映射(ORM)、数据检索、延迟加载、一对一关联...
Hibernate作为Java领域中流行的ORM(对象关系映射)框架,提供了丰富的注解来简化实体类与数据库表之间的映射。本文将深入解析一系列关键注解,帮助理解Hibernate如何实现这一过程。 #### 1. `@Entity`与`@Table` ...