在Hibernate框架中编写持久对象类实现外键关联的几点注意事项

关系数据库系统本身就比较复杂,加上Hibernate的O/R映射层,复杂度加重了,很容易出现问题,本人将最近遇到的问题和解决方法做一个总结,整理在下面的一系列文章中

正确理解Hibernate的聚合类型(collection)的使用

在Hibernate中正确实现关联关系中的级联操作(cascading)

在Hibernate框架中编写持久对象类实现外键关联的几点注意事项

本文是第三篇,讲解在one-to-many(一对多)关联关系中的对象类的几个关键方法的实现。主要是equals(),hashCode()和实例化方法。

在在Hibernate中正确实现关联关系中的级联操作(cascading)中,我们讲了怎样正确声明关联关系和使用持久化方法,我们紧接上一篇的例子,要能够保证从User到Preference的级联的正确运行,必须要正确实现equals(),hashCode()和没有参数的实例化方法。

在equals()和hashCode()的计算中,一定要注意:要使用能够排他性区别对象的对象属性成员计算hash code和相等运算。最合适的对象属性是业务层面的关键字(business key或者称为natural key),而不能使用Hibernate自动计算赋值的primary key(主键),当然,以上结论是在一定环境下的,即:我们假设数据库中的表的主键使用某种唯一性id,而不是其natural key。例如,User表中name就是natural key,Hibernate给出了很多理由说明使用natural key作为主键的不方便性。

主键本来就是唯一的,为什么不能参与equals()和hashCode()的运算,如果能的话,计算方法大大简化了:只使用主键判断相等和直接使用主键的hash code。实际上,主键不是不能这样用,而是要分场合,如果,主键是应用程序赋予的,例如uuid,完全可以使用。但是,如果主键是让Hibernate 在持久化时产生的,就不能使用了,例如,一个对象刚创建,还没有持久化,就没有分配一个主键,会出现一下异常

java.lang.NullPointerException

以上两个方法必须实现,否则,在级联关系中Preference对象的持久化操作将受影响。

如果空实例化操作不实现会怎样呢?如果Preference的空实例化方法不实现,将出现以下异常

org.hibernate.InstantiationException: No default constructor for entity: xxx

时间: 2025-01-30 11:24:37

在Hibernate框架中编写持久对象类实现外键关联的几点注意事项的相关文章

【hibernate框架】关系映射之一对一单项外键关联(Annotation实现)

一对一单向外键关联(Annotation做法): 例子,假设一夫配一妻(Husband与Wife).两个实体类的例子: Husband.java: package cn.edu.hpu.one2one; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.OneToOne; @Entity pu

【hibernate框架】关系映射之一对一单向外键关联(XML实现)

在XML里面如何单向关联: 学生证与学生卡是一对一的关系,在学生证那一方做关联 Student.java: package cn.edu.hpu.model; public class Student { private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String g

深入解析Java的Hibernate框架中的持久对象_java

一.持久对象生命周期应用程序在使用Hibernate框架后,创建的持久对象会经历一整套生命周期来完成数据库的操作,其中主要的三个状态分别是瞬态(Transient).持久化(Persistent).脱管(detached).这三种状态的转换是能够在应用程序中控制的,如下图: 为了能清楚的了解这几种状态,这里使用一个实例来查看下这几种状态下对象的不同,下面状态内的代码,具体步骤如下: (1)创建Hibernate_session程序集,并添加像相应的jar包: (2)配置Hibernate,添加相

Java的Hibernate框架中的双向主键关联与双向外键关联_java

一.双向主键关联双向的主键关联其实是单向一对一主键关联的一种特殊情况,只不过要在关联对象的两端的映射文件中都要进行<one-to-one>的配置,另外还要在主映射的主键一端采用foreign外键关联属性. 这里同样使用Person和IdCard来讨论,一个人对应着一个唯一的身份证,而且一个身份证也唯一映射着一个人,所以这就产生了双向的关联关系,Person的主键同样也是IdCard的主键,分别是主键的同时也是外键,这种关联关系成为双向一对一映射,表现到关系模型中可如下图: 图中的两个表采用了主

Java的Hibernate框架中一对多的单向和双向关联映射_java

一.一对多单向关联映射 一对多关系的对象模型在日常生活中也经常看到,就拿学生和班级来说,一个班级里有多个学生,所以班级和学生的关系是一对多的关系,映射到对象模型中,如下图: 对象模型说明了这种一对多的关系是由一的一端来维护的,那么映射成关系模型就是一个班级字段下面会有多个学生,这样就形成了一对多的关系,通过班级能够查询获得学生信息,对应的关系模型如下图: 1.基本配置 有了对象模型接下来就让它们映射为对应的关系代码,在进行关系映射时需要在一的一端添加<one-to-many>标签,另外还需要在

深入解析Java的Hibernate框架中的一对一关联映射_java

作为一个ORM框架,hibernate肯定也需要满足我们实现表与表之间进行关联的需要.hibernate在关联方法的实现很简单.下面我们先来看看一对一的做法:  不多说了,我们直接上代码:  两个实体类,TUser和TPassport: public class TUser implements Serializable{ private static final long serialVersionUID = 1L; private int id; private int age; priva

Hibernate框架中的缓存技术详解_java

本文实例讲述了Hibernate框架中的缓存技术.分享给大家供大家参考,具体如下: Hibernate框架的缓存分为Session的缓存.SessionFactory的缓存,也称为一级缓存和二级缓存. 一级缓存: 一级缓存是Session级的缓存,其生命周期很短,与Session相互对应,由Hibernate进行管理,属于事务范围的缓存.当程序调用 Session的load()方法.get()方法.save()方法.saveOrUpdate()方法.update()方法或查询接口方法时,Hibe

linux中编写并发队列类

 这篇文章主要介绍了linux中编写并发队列类,功能有:并发阻塞队列.有超时限制.有大小限制 设计并发队列   代码如下: #include <pthread.h> #include <list> using namespace std;   template <typename T> class Queue  {  public:      Queue( )      {          pthread_mutex_init(&_lock, NULL); 

【hibernate框架】一对一双向外键关联(Annotation实现)

一对一双向外键关联(Annotation方法): 一夫(Husband)一妻(Wife)的一对一双向外键关联 Husband和Wife实体类: package cn.edu.hpu.one2one; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import jav