12.Hibernate双向基于链表的1-N映射

来源:互联网 发布:比特币购买 知乎 编辑:程序博客网 时间:2024/04/30 00:46

多的一方映射

<?xml version="1.0" encoding="GBK"?><!-- 指定Hibernate的DTD信息 --><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="org.crazyit.app.domain"><!-- 映射Person持久化类 --><class name="Person" table="person_inf"><!-- 映射标识属性id --><id name="id" column="person_id"><!-- 定义主键生成器策略 --><generator class="identity" /></id><!-- 用于映射普通属性 --><property name="name" type="string" /><property name="age" type="int" /><!-- 映射集合属性,集合元素是其他持久化实体 没有指定cascade属性 --><set name="addresses" inverse="true" table="person_address"><!-- 指定关联的外键列 --><key column="person_id" /><!-- 用以映射到关联类属性 --><many-to-many class="Address" column="address_id"unique="true" /></set></class></hibernate-mapping>
一方的映射文件,join用来将表的主键映射到连接表
<?xml version="1.0" encoding="GBK"?><!-- 指定Hibernate的DTD信息 --><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="org.crazyit.app.domain"><!-- Address持久化类--><class name="Address" table="address_inf"><!-- 映射标识属性addressId --><id name="addressId" column="address_id"><!-- 指定主键生成器策略 --><generator class="identity"/></id><!-- 映射普通属性addressdetail --><property name="addressDetail"/><!-- 显式使用join元素确定连接表 --><join table="person_address"><!-- key映射外键列 --><key column="address_id"/><!-- 使用many-to-one映射N-1关联实体 --><many-to-one name="person"column="person_id" not-null="true"/></join></class></hibernate-mapping>
package org.crazyit.app.domain;public class Address {// 标识属性private int addressId;// 地址详细信息private String addressDetail;// 记录关联实体的person属性private Person person;// 无参数的构造器public Address() {}// 初始化全部属性的构造器public Address(String addressDetail) {this.addressDetail = addressDetail;}// addressId属性的setter和getter方法public void setAddressId(int addressId) {this.addressId = addressId;}public int getAddressId() {return this.addressId;}// addressDetail属性的setter和getter方法public void setAddressDetail(String addressDetail) {this.addressDetail = addressDetail;}public String getAddressDetail() {return this.addressDetail;}// person属性的setter和getter方法public void setPerson(Person person) {this.person = person;}public Person getPerson() {return this.person;}}

package org.crazyit.app.domain;import java.util.*;public class Person {// 标识属性private Integer id;// Person的name属性private String name;// 保留Person的age属性private int age;// 1-N关联关系,使用Set来保存关联实体private Set<Address> addresses = new HashSet<Address>();// id属性的setter和getter方法public void setId(Integer id) {this.id = id;}public Integer getId() {return this.id;}// name属性的setter和getter方法public void setName(String name) {this.name = name;}public String getName() {return this.name;}// age属性的setter和getter方法public void setAge(int age) {this.age = age;}public int getAge() {return this.age;}// addresses属性的setter和getter方法public void setAddresses(Set<Address> addresses) {this.addresses = addresses;}public Set<Address> getAddresses() {return this.addresses;}}

测试代码

public class PersonManager {public static void main(String[] args) {PersonManager mgr = new PersonManager();mgr.testPerson();HibernateUtil.sessionFactory.close();}private void testPerson() {Session session = HibernateUtil.currentSession();Transaction tx = session.beginTransaction();// 创建一个Person对象Person p = new Person();// 设置Person的Name为Yeeku字符串p.setName("Yeeku");p.setAge(29);// 持久化Person对象(对应于插入主表记录)session.save(p);// 创建一个瞬态的Address对象Address a = new Address("广州天河");// 先设置Person和Address之间的关联关系a.setPerson(p);// 再持久化Address对象(对应于插入从表记录)session.persist(a);// 创建一个瞬态的Address对象Address a2 = new Address("上海虹口");// 先设置Person和Address之间的关联关系a2.setPerson(p);// 再持久化Address对象(对应于插入从表记录)session.persist(a2);tx.commit();HibernateUtil.closeSession();}}

源码来自李刚的j2e轻量级应用

0 0
原创粉丝点击