Hibernate 添加数据 (多对多)
新增多对多数据
class Person
{
private int id ;
private String name;
private int age ;
private Set<Works> workSet = new HashSet<>();
}
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>
<property name="name" length="51" type="string"></property>
<property name="age" type="integer"></property>
<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();
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();
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);
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.getWorkSet().add(works);
works.getPersonSet().add(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-update 和 delete 总和
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.getWorkSet().add(works);
works.getPersonSet().add(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(?, ?)
从而建立了主从关系映射