hibernate基于连接表的多对一单向关联

sql脚本:

create table Person3 ( personId number(10) not null primary key ,personName NVARCHAR2(100) );
create table PersonAddress3 ( personId3 number(10) not null primary key , addressId3 number(10) );
create table Address3 ( addressId number(10) not null primary key,addressName NVARCHAR2(100) );

person.hbm.xml:

<class name="com.chenjun.eshop.staffManage.domain.Person"
		table="Person3">

		<id name="id" column="personId">
			<generator class="assigned"><!-- 由程序分配主键 -->

			</generator>
		</id>

		<property name="personName"></property>
<!-- personId3,addressId3  都是连接表PersonAddress3的字段 -->
		<join table="PersonAddress3" optional="true">
			<key column="personId3" unique="true" />
			<many-to-one name="address" column="addressId3"
				not-null="true" />
		</join>

	</class>

address.hbm.xml:

	<class name="com.chenjun.eshop.staffManage.domain.Address"
		table="Address3">

		<id name="id" column="addressId">
			<generator class="assigned"><!-- 由程序分配主键 -->
			</generator>
		</id>
		
		<property name="addressName"></property>
	</class>

测试代码:

public void test()
    {

        Session session = this.getHibernateTemplate().getSessionFactory().openSession();
        session.beginTransaction();

        
        
        Address address1 = new Address();
        address1.setId(1);
        address1.setAddressName("武汉");
        session.save(address1);//要先持久化,不然报org.hibernate.exception.ConstraintViolationException: could not insert: [com.chenjun.eshop.staffManage.domain.Person]
        
        Person person1 = new Person();
        person1.setId(11);
        person1.setPersonName("王五");
        person1.setAddress(address1);
        
        Person person2 = new Person();
        person2.setId(12);
        person2.setPersonName("赵六");
        person2.setAddress(address1);
        
        
        session.save(person1);
        session.save(person2);

        // hibernate中的增删改都要提交事件,因为它默认是设为不提交的,而jdbc的connect是默认提交的。
        session.beginTransaction().commit();

        // 释放资源
        session.close();

    }

后台sql执行过程:

 insert into Address3 (addressName, addressId) values (?, ?)

 insert into Person3 (personName, personId) values (?, ?)
 insert into PersonAddress3 (addressId3, personId3) values (?, ?)

insert into Person3 (personName, personId) values (?, ?)
insert into PersonAddress3 (addressId3, personId3) values (?, ?)
你可以注意到,它与我上一文章,一对多的sql执行顺序是有区别的,一对多是先执行完多方,再执行完一方,再执行连接表;而这里是先执行一方,再执行多方一次,紧接着就执行连接表,而不是等多方都执行完后,再统一执行连接表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值