Hibernate 添加数据 二 (多对多)

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
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

早起的年轻人

创作源于分享

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值