Hibernate关联关系-one2one

    前两天在写毕业设计的时候,用到了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
				+ "]";
	}


Person.hbm.xml 映射文件

   
   


   
   
	
    
    
		
     
       
            
      
      
        
     
       
        
     
       
        
     
     
	
    
    

   
   


运行后的表结构:

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表:


测试类也是大同小异,就不重复写了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值