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(?, ?)

从而建立了主从关系映射
早起的年轻人 CSDN认证博客专家 移动开发 项目管理 Java
只要用心去做,每一件事情还是有可能成功的,当然成功是没有界限的,只不过是达到自己心里的那个目标,公众号:我的大前端生涯,一个爱喝茶的程序员,通常会搞搞SpringBoot 、Herbinate、Mybatiys、Android、iOS、Flutter、Vue、小程序等.
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页