基于主键一对一关联映射--单双向

基于主键关联的单向一对一关联通常使用一个特定的id生成器。

单向关联示例

Person类

public class Person {
	private int id;
	private String name;
	private int age;
	private IdCard idCard;
	//省略get/set方法
}
IdCard类

public class IdCard {
	private int id;
	private String code;
	//省略get/set方法
}
Person.hbm.xml配置文件

<hibernate-mapping package="com.test.pojo">
	<class name="Person">
		<id name="id">
		    <!-- foreign表示引用外键 -->
			<generator class="foreign">
			<!-- 引用idCard属性所对应的主键 -->
			<param name="property">idCard</param>
			</generator>
		</id>
		<property name="name" />
		<property name="age"/>
		<one-to-one name="idCard" constrained="true"
		 cascade="save-update"/>
	</class>
</hibernate-mapping>
IdCard.hbm.xml配置文件

<hibernate-mapping package="com.test.pojo">
	<class name="IdCard">
		<id name="id">
			<generator class="native"></generator>
		</id>
		<property name="code" />
		
	</class>
</hibernate-mapping>

测试类

public class HibernateTest {
	@Test
	public void testCreateDB(){
		Configuration cfg=new Configuration().configure();
		SchemaExport se=new SchemaExport(cfg);
		//第一个参数表示是否生成ddl脚本,第二个参数表示是否执行到数据库中
		se.create(true, true);
	}
	/**
	 * 保存数据
	 */
	@Test
	public void save(){
		Session session=null;
		Transaction tx=null;
		try{
			session=HibernateUtil.getSession();
			tx=session.beginTransaction();
			IdCard id1=new IdCard();
			id1.setCode("124234545656767");
			IdCard id2=new IdCard();
			id2.setCode("120343435454556");
			Person person1=new Person();
			person1.setName("孙悟空");
			person1.setAge(500);
			person1.setIdCard(id1);
			Person per=new Person();
			per.setName("唐僧");
			per.setAge(30);
			per.setIdCard(id2);
			Person per2=new Person();
			per2.setName("白骨精");
			per2.setAge(500);
			per2.setIdCard(id1);
			session.save(person1);
			session.save(per);
			//保存会出错
			//session.save(per2);
			tx.commit();
		}catch(Exception e){
			if(tx!=null)
				tx.rollback();
			e.printStackTrace();
		}finally{
			HibernateUtil.closeSession();
		}
	}
}
执行testCreateDB控制台打印信息如下:

alter table Person 
        drop 
        foreign key FK_3blpx78aucutb5umaelf9essh

    drop table if exists IdCard

    drop table if exists Person

    create table IdCard (
        id integer not null auto_increment,
        code varchar(255),
        primary key (id)
    )

    create table Person (
        id integer not null,
        name varchar(255),
        age integer,
        primary key (id)
    )

    alter table Person 
        add constraint FK_3blpx78aucutb5umaelf9essh 
        foreign key (id) 
        references IdCard (id)

执行save控制台打印信息如下:

Hibernate: 
    insert 
    into
        IdCard
        (code) 
    values
        (?)
Hibernate: 
    insert 
    into
        Person
        (name, age, id) 
    values
        (?, ?, ?)
Hibernate: 
    insert 
    into
        IdCard
        (code) 
    values
        (?)
Hibernate: 
    insert 
    into
        Person
        (name, age, id) 
    values
        (?, ?, ?)

数据库表信息如下:

            

双向关联示例(只展示与单向关联示例不同的地方)

IdCard类

public class IdCard {
	private int id;
	private String code;
	private Person person;
	//省略get/set方法
}

IdCard.hbm.xml配置文件

<hibernate-mapping package="com.test.pojo">
	<class name="IdCard">
		<id name="id">
			<generator class="native"></generator>
		</id>
		<property name="code" />
		<one-to-one name="person" />
	</class>
</hibernate-mapping>

测试类获取数据

@Test
	public void testGet(){
		Session session=null;
		Transaction tx=null;
		try{
			session=HibernateUtil.getSession();
			tx=session.beginTransaction();
			Person person=(Person) session.get(Person.class, 1);
			System.out.println("personName:"+person.getName()+"----idCard:"+person.getIdCard().getCode());
			System.out.println("=============");
			IdCard idcard=(IdCard) session.get(IdCard.class, 2);
			System.out.println("personName:"+idcard.getPerson().getName()+"----idCard:"+idcard.getCode());
			tx.commit();
		}catch(Exception e){
			if(tx!=null)
				tx.rollback();
			e.printStackTrace();
		}finally{
			HibernateUtil.closeSession();
		}
	}

执行testGet控制台打印信息如下:

Hibernate: 
    select
        person0_.id as id1_1_0_,
        person0_.name as name2_1_0_,
        person0_.age as age3_1_0_ 
    from
        Person person0_ 
    where
        person0_.id=?
Hibernate: 
    select
        idcard0_.id as id1_0_0_,
        idcard0_.code as code2_0_0_,
        person1_.id as id1_1_1_,
        person1_.name as name2_1_1_,
        person1_.age as age3_1_1_ 
    from
        IdCard idcard0_ 
    left outer join
        Person person1_ 
            on idcard0_.id=person1_.id 
    where
        idcard0_.id=?
personName:孙悟空----idCard:124234545656767
=============
Hibernate: 
    select
        idcard0_.id as id1_0_0_,
        idcard0_.code as code2_0_0_,
        person1_.id as id1_1_1_,
        person1_.name as name2_1_1_,
        person1_.age as age3_1_1_ 
    from
        IdCard idcard0_ 
    left outer join
        Person person1_ 
            on idcard0_.id=person1_.id 
    where
        idcard0_.id=?
personName:唐僧----idCard:120343435454556







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值