Hibernate 添加数据 二 (多对多)

来源:互联网 发布:吉诺比利巅峰数据 编辑:程序博客网 时间:2024/06/05 02:08

Hibernate 添加数据 (多对多)

新增多对多数据

class Person{    private int id ;    private String name;    private int age ;    //多对多     private Set<Works> workSet = new HashSet<>();    //get set 方法省略 }public class Works {   private int id;   private String name;   //多对多   private Set<Person> personSet = new HashSet<Person>();}

配制Person类对应文件清单 Person.hbm.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping>    <class name="com.Person"        dynamic-insert="true" dynamic-update="false" table="t_person_list">        <!-- 主键 -->        <id name="id">            <generator class="native"></generator>        </id>         <!-- 属性 name配制  -->        <property name="name" length="51" type="string"></property>        <!-- 属性 age配制  -->        <property name="age" type="integer"></property>        <!-- 多对多配制  -->        <!--多对多描述 -->        <!--table 中间表 -->        <set name="workSet" table="t_p_w_list">            <!--本类对应的外键 -->            <key column="p_id"></key>            <!--另一方配制 -->            <many-to-many class="com.Works"                column="w_id"></many-to-many>        </set>    </class></hibernate-mapping>

配制Works类对应文件清单 Works.hbm.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping>    <class name="com.Works" dynamic-insert="true"        dynamic-update="false" table="t_w_list">        <!-- 主键 -->        <id name="id">            <generator class="native"></generator>        </id>        <property name="name" length="51" type="string"></property>            <!--多对多描述 -->        <set name="personSet" table="t_p_w_list">            <key column="w_id"></key>            <many-to-many class="com.Person"                column="p_id"></many-to-many>        </set>    </class></hibernate-mapping>

新增数据操作 一 (只保存Person)

public void addModel(){    Person person = new Person();    person.setName("xx");    person.setAge(12);    Session session = H3Utils.getCurrentSession();     session.beginTransaction();     //保存      //执行save方法     session.save(person);     session.getTransaction().commit();}

说明 一:

当执行 save 方法时  会调用一次 insert语句 insert into t_person_list (name, age) values(?, ?)

新增数据操作 二 (只保存Works)

public void addModel(){    Works works = new Works();    works.setName("java");    Session session = H3Utils.getCurrentSession();     session.beginTransaction();     //保存      //当执行save方法的时候 会     session.save(works);     session.getTransaction().commit();}

说明 二:

当执行 save 方法时  会调用一次 insert语句 insert into t_w_list (name) values(?)

新增数据操作 三 (保存Person 和 Works Person关联Works 主关联从表 或者 Works关联Person 从关联主)

public void addPersonAndWork1() {    Session currentSession = H3Utils.getCurrentSession();    currentSession.beginTransaction();    Person person = new Person();    person.setName("xiaosan1");    person.setAge(121);    Works works = new Works();    works.setName("23");    person.getWorkSet().add(works);    //保存person    currentSession.save(person);    currentSession.save(works);    currentSession.getTransaction().commit();}

说明 三 :

当执行 currentSession.save(person); 方法时  会调用一次 insert语句 insert into t_person_list (name) values(?)当执行 currentSession.save(works); 方法时  会调用一次 insert语句 insert into   t_w_list (name)  values (?)最后 commit insert into t_p_w_list (p_id, w_id) values (?, ?)

新增数据操作 四 (保存Person 和 Course 并进行双向关联 设置inverse方式)

这时我们需要设置 多对多中 一方放弃主动维护关系表,比如这里设置Person不去主动维护<!--多对多描述 -->        <set name="workSet" table="t_p_w_list" inverse="true">            <key column="p_id"></key>            <many-to-many class="android.longs.study.test.Works"                column="w_id"></many-to-many>        </set>
public void addModel(){    Session currentSession = H3Utils.getCurrentSession();    currentSession.beginTransaction();    Person person = new Person();    person.setName("xiaosan1");    person.setAge(121);    Works works = new Works();    works.setName("23");    //person 关联 works     person.getWorkSet().add(works);    //works 关联 person    works.getPersonSet().add(person);    //保存person    currentSession.save(person);    currentSession.save(works);    currentSession.getTransaction().commit();}

说明 四 :

当执行 currentSession.save(person); insert into t_person_list (name, age) values(?, ?)当执行 currentSession.save(works);insert into t_w_list (name) values(?)当最后commit时 执行 insert into t_p_w_list (w_id, p_id) values(?, ?)从而建立了主从关系映射

新增数据操作 五 (保存Course 和 Person 并且进行双向关联 使用级联操作 )

可以在 Person.hbn.xml 中对应设置级联保存<!--多对多描述 -->        <set name="workSet" table="t_p_w_list" cascade="save-update">            <key column="p_id"></key>            <many-to-many class="android.longs.study.test.Works"                column="w_id"></many-to-many>        </set>
cascade     设置为none , 没有级联操作    设置为 save-update,级连保存或者更新 当save一方的时候,如果这时关联了瞬时态的多方,那么将触发级联操作,将瞬时态的多方转为持久态,也就是多执行了一次insert,最后再执行update     设置为 delete,级连删除 当删除一方的时候,会同时去删除其所关联的多方      设置为 delete-orphan,孤儿删除     设置为 all,代表 可以拥有 save-updatedelete 总和    cascade  设置为 all-delete-orphan,代表 所有  
public void addPersonAndCourseFuoncion1() {    Session currentSession = H3Utils.getCurrentSession();    currentSession.beginTransaction();    Person person = new Person();    person.setName("xiaosan1");    person.setAge(121);    Works works = new Works();    works.setName("23");    //person 关联 works     person.getWorkSet().add(works);    //works 关联 person    works.getPersonSet().add(person);    //保存person    currentSession.save(person);    currentSession.getTransaction().commit();}

说明 五 :

当执行 currentSession.save(person); insert into t_person_list (name, age) values(?, ?)当执行 currentSession.save(works);insert into t_w_list (name) values(?)当最后commit时 执行 insert into t_p_w_list (w_id, p_id) values(?, ?)从而建立了主从关系映射
0 0
原创粉丝点击