hibernate多表操作

hibernate一对多&一对多
在这里插入图片描述
Customer

public class Customer {
    private String id;//客户表id
    private String name;//客户表name
    //表示一个Customer有多个LinkMan 一对多
    private Set<LinkMan> linkMens = new HashSet<LinkMan>();
    //getter setter
}

LinkMan

public class LinkMan {
    private String id;//联系人表id
    private String name;//联系人表name
    //表示LinkMan属于哪个Customer 多对一
    private Customer customer;//相当于外键字段
    //getter setter
}
有几个持久化从表 对象主表对象会产生几个个update语句维护外键关系
而产生的多条语句是冗余的 运行时会影响效率 需配置主表放弃外键关系
注意 : 配置配置主表放弃维护关系后 主表对象持久化不能控制外键
inverse属性(默认false):
    true:当前对象不维护关系
    false:当前对象维护关系
从表映射文件不可取消维护关系 只有也只能主表可取消维护关系


主表对象inverse为false时 删除操作会删除主表数据和修改对应从表外键数据
主表对象cascade为delete时 级联删除操作会删除主表数据并删除对应从表数据

Customer.hbm.xml

<hibernate-mapping package="com.java.entity" >
	<class name="Customer" table="customer" >
		<id name="id" >
			<generator class="uuid"></generator>
		</id>
    	<property name="name" column="name" ></property>

	    <!-- 一对多关系 -->
            <!-- 集合 一对多关系 在配置文件中配置 -->
            <!-- 
                name属性:集合属性名
                column属性:外键列名
                class属性:与我关联的对象完整类名
            -->
            <!-- 
                级联操作:cascade
                save-update:级联保存更新
                delete:级联删除
                all:save-update+delete
            -->
            <!-- inverse属性:配置关系是否维护
                    true:customer不维护关系
                    false(默认值):customer维护关系
                    
                inverse属性:性能优化 提高关系维护的性能
                原则:无论怎么放弃 总有一方必须要维护关系
                一对多关系中:只能'一'放弃 '多'不能放弃
                外键在从表 从表不能不维护级联关系
            -->
            <set name="linkMens" inverse="true" cascade="delete" >
                <key column="lkm_cust_id" ></key>
                <one-to-many class="LinkMan" />
            </set>
        </class>
</hibernate-mapping>

LinkMan.hbm.xml

<hibernate-mapping package="com.java.entity" >
	<class name="LinkMan" table="linkman" >
		<id name="id" >
			<generator class="uuid"></generator>
		</id>
		<property name="name" column="name" ></property>
		<!-- 多对一关系 -->
		<!-- 多的一方:不能放弃维护关系的 外键字段就在多的一方 -->
		<many-to-one name="customer" column="lkm_cust_id" class="Customer" >
		</many-to-one>
	</class>
</hibernate-mapping>

级联更新保存

//Customer文件配置级联更新后 更新客户数据会更新已创建联系人数据
//LinkMan文件配置级联删除后 保存联系人数据会更新已创建的客户数据
Transaction transaction = session.beginTransaction();
		
Customer customer = new Customer();
customer.setName("客户");

LinkMan lm1 = new LinkMan();
lm1.setName("联系人1");

LinkMan lm2 = new LinkMan();
lm2.setName("联系人2");

//表达一对多关系 客户下有多个联系人
//inverse为true 客户对象表达关系为忽略不写
//customer.getLinkMens().add(lm1);
//customer.getLinkMens().add(lm2);

//表达多对一关系 联系人属于哪个客户
lm1.setCustomer(customer);
lm2.setCustomer(customer);

session.save(customer);

//主表对象配置级联保存更新 从表对象如下操作可省略
//session.save(lm1);
//session.save(lm2);

transaction.commit();

级联删除

Transaction transaction = session.beginTransaction();

//Customer文件配置级联删除后 删除客户会失去外键限制并自动删除对应联系人数据
Customer customer = session.get(Customer.class, "TEST-ID");
session.delete(customer);

transaction.commit();

hibernate一对多&一对多
在这里插入图片描述
Staff

public class Staff {
    private String id;//员工表id
    private String name;//员工表name
    //表示一个Staff有多个Role 一对多
    private Set<Role> roles = new HashSet<Role>();
    //getter setter
}

Role

public class Role {
    private String id;//角色表id
    private String name;//角色表name
    //表示一个Role有多个Staff 一对多
    private Set<Staff> staffs = new HashSet<Staff>();
    //getter setter
}

Staff.hbm.xml

<hibernate-mapping package="com.java.entity" >
	<class name="Staff" table="staff" >
		<id name="id" >
			<generator class="uuid"></generator>
		</id>
    <property name="name" column="name" ></property>

    <!-- 多对多关系 -->
            <!-- 
				name:集合属性名
				table:配置中间表名
				key->column:外键 其它表引用staff表的外键列
				class:与Staff类多对多关系的类名
				column:外键 staff表引用其它表的外键列
            -->
			<set name="roles" table="staff_role" cascade="save-update" >
				<key column="staff_id" ></key>
				<many-to-many class="Role" column="role_id" ></many-to-many>
			</set>
      </class>
</hibernate-mapping>

Role.hbm.xml

<hibernate-mapping package="com.java.entity" >
	<class name="Role" table="role" >
		<id name="id" >
			<generator class="uuid"></generator>
		</id>
    	<property name="name" column="name" ></property>
    	
    <!-- 多对多关系 -->
	    <!-- 使用inverse属性
			true: 放弃维护外键关系
			false(默认值):维护关系
			
			结论:实际开发中 遇到多对多关系 必须选择一方放弃维护关系
				业务方向->如录入员工时 需要为员工指定所属角色
				即由员工维护角色 角色不需要维护与员工关系 角色放弃维护
		 -->
			<set name="staffs" table="staff_role" cascade="save-update"
				inverse="true" >
				
				<key column="role_id" ></key>
				<many-to-many class="Staff" column="staff_id" ></many-to-many>
			</set>
      </class>
</hibernate-mapping>

级联更新保存

Transaction transaction = session.beginTransaction();

//创建员工对象
Staff staff1 = new Staff();
staff1.setName("员工1");

Staff staff2 = new Staff();
staff1.setName("员工2");

//创建角色对象
Role role1 = new Role();
role1.setName("角色1");

Role role2 = new Role();
role1.setName("角色2");

//员工对象表达关系
staff1.getRoles().add(role1);
staff1.getRoles().add(role2);

staff2.getRoles().add(role1);
staff2.getRoles().add(role2);

//inverse为true 角色对象表达关系为忽略不写
//role1.getStaffs().add(staff1);
//role1.getStaffs().add(staff2);

//role2.getStaffs().add(staff1);
//role2.getStaffs().add(staff2);

//使用save持久化对象
session.save(staff1);
session.save(staff2);
//session.save(role1);
//session.save(role2);

transaction.commit();

级联删除

Transaction transaction = session.beginTransaction();

//Staff文件配置级联删除后 删除员工会失去外键限制并自动删除中间表对应的员工数据
Staff staff = session.get(Staff.class, "TEST-ID");
session.delete(staff);

transaction.commit();

转载于:https://www.cnblogs.com/setlilei/p/10629451.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值