前两天在写毕业设计的时候,用到了hibernate的一对一的关联关系。不知道什么原因,老是出现错误。然后自己到网上查找各种资料,才解决问题。在这里整理一下hibernate的关联关系,以便自己以后可以查看。下面这个测试的例子有很多,我只是做了一个小的修改。
hibernate中一对一关联有两种方式。一种是一对一主键关联,这中关联就是说主表的主键与从表的主键相同,即从表的主键来自于主表主键。另一种就是一对一外键关联,这种关联方式中主表与从表的主键不同,但是从表中有一个字段存放主表中的主键当做外键。
工程目录结构:
hibernate.cfg.xml文件的配置:
root
123
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/hibernate_test?useUnicode=true&characterEncoding=UTF-8
org.hibernate.dialect.MySQL5InnoDBDialect
true
false
update
一、一对一主键关联
IdCard.java实体类:
package hibernateOneToOneMajor.entity;
import java.text.SimpleDateFormat;
import java.util.Date;
public class IdCard {
private int id;
private Date authorizeDate;
private Person person;
//getters and setters省略...
@Override
public String toString() {
return "IdCard [authorizeDate=" + authorizeDate != null ? new SimpleDateFormat("yyyy-MM-dd hh:ss:mm").format(authorizeDate) : "" + ", id=" + id
+ ", person=" + person + "]";
}
}
IdCard.hbm.xml映射文件
person
Person.java实体类:
private int id;
private String name;
private IdCard idCard;
//getters and setters省略...
@Override
public String toString() {
return "Person [id=" + id + ", idCard=" + idCard + ", name=" + name
+ "]";
}
运行后的表结构:
id_card表:
person表:
测试:test.java
package hibernateOneToOneMajor.test;
import hibernateOneToOneMajor.entity.IdCard;
import hibernateOneToOneMajor.entity.Person;
import java.util.Date;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
public class TestOneToOneMajor {
public static Session getSession(){
//使用的hibernate-core-4.2.2.Final.jar版本不同加载方式也不同
Configuration configuration = new Configuration().configure();
ServiceRegistryBuilder serviceBinding = new ServiceRegistryBuilder().applySettings(configuration.getProperties());
ServiceRegistry serviceRegistry = serviceBinding.buildServiceRegistry();
SessionFactory factory = configuration.buildSessionFactory(serviceRegistry);
Session session = factory.openSession();
return session;
}
public void testOneToOneSava(){
Transaction ts = null;
Session session = TestOneToOneMajor.getSession();
try {
ts = session.beginTransaction();
IdCard ic = new IdCard();
ic.setAuthorizeDate(new Date());
Person p = new Person();
p.setName("zhangsan");
p.setIdCard(ic);
ic.setPerson(p);
session.save(p);
/**
* 如果在Person.hbm.xml中的one-to-one中加入级联
*
* 就不用下列操作
*/
session.save(ic);
ts.commit();
} catch (Exception e) {
System.out.println("数据保存出现错误!");
e.printStackTrace();
}finally{
if(session != null){
session.close();
}
}
}
public void testOneToOneUpdate(){
Transaction ts = null;
Session session = TestOneToOneMajor.getSession();
try {
ts = session.beginTransaction();
Person p = new Person();
p.setId(8);
p.setName("zhangsan8");
session.update(p);
ts.commit();
} catch (Exception e) {
System.out.println("数据更新出现错误!");
e.printStackTrace();
}finally{
if(session != null){
session.close();
}
}
}
public void testOneToOneDelete(){
Transaction ts = null;
Session session = TestOneToOneMajor.getSession();
try {
ts = session.beginTransaction();
IdCard ic = new IdCard();
ic.setId(4);
Person p = new Person();
ic.setPerson(p);
p.setIdCard(ic);
session.delete(ic);
ts.commit();
} catch (Exception e) {
System.out.println("数据删除出现错误!");
e.printStackTrace();
}finally{
if(session != null){
session.close();
}
}
}
@SuppressWarnings("unchecked")
public void testOneToOnefind(){
Session session = TestOneToOneMajor.getSession();
try {
String hql = "from Person";
Query query = session.createQuery(hql);
List
list = query.list();
for(Person p : list){
System.out.println(p);
}
} catch (Exception e) {
System.out.println("数据查询出现错误!");
e.printStackTrace();
}finally{
if(session != null){
session.close();
}
}
}
public static void main(String[] args) {
TestOneToOneMajor t = new TestOneToOneMajor();
// for(int i = 0; i < 5; i++){
t.testOneToOneSava();
// }
//t.testOneToOneUpdate();
//t.testOneToOneDelete();
t.testOneToOnefind();
}
}
二、一对一外键关联:
在外键关联中与主键关联中实体类是相同的,xml文件就只有两点不同:
主表的映射文件即PersonForeign.hbm.xml与主键关联的相同。
在从表中即IdCardForeign.hbm.xml有两点不同:
运行后的表结构:
id_card表:person表: