集合映射
保存值类型集合的数据的表叫做集合表
值类型对象参考组件映射
选择集合接口:
1、<set>元素:可以映射类型为java.util.Set接口的属性,它的元素存放在没有顺序且不重复的;也可以映射类型为java.util.SortSet接口的属性,它的元素可以按自然顺序排列
Student.java部分:
public class Student {
private int id;
private String name;
private Set<String> hobbies;//爱好
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<String> getHobbies() {
return hobbies;
}
public void setHobbies(Set<String> hobbies) {
this.hobbies = hobbies;
}
Student.hbm.xml部分
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping
package="com.hbsi.domain">
<class name="Student" table="student">
<id name="id"column="id">
<!-- native自动增长 根据不同的底层数据库选择产生不同的策略 -->
<generator class="native"/>
</id>
<property name="name"/>
<set name="hobbies"table="student_hobby">
<!-- 指定外键类student_id -->
<key column="student_id"></key>
<!-- 元素的类型 -->
<element type="string"column="bobbies_name"/>
</set>
</class>
</hibernate-mapping>
TestSet.java部分:
public static void add(){
Session session=null;
Transaction ts=null;
try{
session=HibernateUtil.getSession();
ts=session.beginTransaction();
Student s=new Student();
s.setName("qdqwed");
Set<String>hobbies=new HashSet<String>();
hobbies.add("dance");
hobbies.add("sing");
s.setHobbies(hobbies);
session.save(s);
ts.commit();//添加学生机学生爱好
}finally{
if(session!=null){
session.close();
}
}
}
2、<list>元素:可以映射类型为java.util.List接口的属性,它需要在集合属性对应的数据库表中用一个额外的索引列保存每个元素的位置
Student.java部分:
package com.hbsi.domain;
import java.util.List;
//集合映射
public class Student {
private int id;
private String name;
private List<String> hobbies;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getHobbies() {
return hobbies;
}
public void setHobbies(List<String> hobbies) {
this.hobbies = hobbies;
}
}
Student.hbm.xml部分:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping
package="com.hbsi.domain">
<class name="Student" table="student">
<id name="id"column="id">
<!-- native自动增长 根据不同的底层数据库选择产生不同的策略 -->
<generator class="native"/>
</id>
<property name="name"/>
<list name="hobbies" table="student_hobby1">
<key column="student_id"></key>
<!-- 指定索引列 维护元素的添加顺序 只在关系模型中有效 -->
<list-index column="order_index"></list-index>
<element type="string"column="hobbies_name"></element>
</list>
</class>
</hibernate-mapping>
TestSet.java部分:
packagecom.hbsi.test;
importjava.util.ArrayList;
importjava.util.List;
importorg.hibernate.Session;
importorg.hibernate.Transaction;
importcom.hbsi.domain.Student;
importcom.hbsi.util.HibernateUtil;
publicclass TestSet {
public static void main(String[] args) {
// TODO Auto-generated method stub
add();
}
public static void add(){
Session session=null;
Transaction ts=null;
try{
session=HibernateUtil.getSession();
ts=session.beginTransaction();
Student s=new Student();
s.setName("qdqwed");
List<String>hobbies=new ArrayList<String>();
hobbies.add("football");
hobbies.add("dance");
hobbies.add("basketball");
s.setHobbies(hobbies);
session.save(s);
ts.commit();//添加学生机学生爱好
}finally{
if(session!=null){
session.close();
}
}
}
}
3、<bag>或<idbag>元素:可以映射为java.util.Collection接口的属性。它的元素可能重复,但不保存属性
Student.java部分:
package com.hbsi.domain;
import java.util.List;
//集合映射
public class Student {
private int id;
private String name;
private List<String> hobbies;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getHobbies() {
return hobbies;
}
public void setHobbies(List<String> hobbies) {
this.hobbies = hobbies;
}
}
Student.hbm.xml部分:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping
package="com.hbsi.domain">
<class name="Student" table="student">
<id name="id"column="id">
<!-- native自动增长 根据不同的底层数据库选择产生不同的策略 -->
<generator class="native"/>
</id>
<property name="name"/>
<bag name="hobbies" table="student_hobby2">
<key column="student_id"></key>
<element type="string"column="hobbies_name"></element>
</bag>
</class>
</hibernate-mapping>
TestSet.java部分:
packagecom.hbsi.test;
importjava.util.ArrayList;
importjava.util.List;
importorg.hibernate.Session;
importorg.hibernate.Transaction;
importcom.hbsi.domain.Student;
importcom.hbsi.util.HibernateUtil;
publicclass TestSet {
public static void main(String[] args) {
// TODO Auto-generated method stub
add();
}
public static void add(){
Session session=null;
Transaction ts=null;
try{
session=HibernateUtil.getSession();
ts=session.beginTransaction();
Student s=new Student();
s.setName("qdqwed");
List<String>hobbies=new ArrayList<String>();
hobbies.add("football");
hobbies.add("dance");
hobbies.add("basketball");
s.setHobbies(hobbies);
session.save(s);
ts.commit();//添加学生机学生爱好
}finally{
if(session!=null){
session.close();
}
}
}
}
4、<map>元素:可以映射类型为java.util.Map接口的属性,它的元素以键/值对的形式保存,也是无序的;也可以映射类型为java.util.SortMap接口的属性,它的元素可以按自然顺序排序
Student.java部分:
package com.hbsi.domain;
import java.util.Map;
//集合映射
public class Student {
private int id;
private String name;
private Map<Long,String> hobbies;
public Map<Long, String> getHobbies() {
return hobbies;
}
public void setHobbies(Map<Long, String> hobbies) {
this.hobbies = hobbies;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Student.hbm.xml部分:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping
package="com.hbsi.domain">
<class name="Student" table="student">
<id name="id"column="id">
<!-- native自动增长 根据不同的底层数据库选择产生不同的策略 -->
<generator class="native"/>
</id>
<property name="name"/>
<map name="hobbies"table="student_hobby3">
<key column="student_id"></key>
<!-- 指定map属性的键在对应表中的列 外键的列 key -->
<map-key type="long"column="hobbies_id"></map-key>
<!-- 键值对的值 value -->
<element type="string"column="hobbies_name"></element>
</map>
</class>
</hibernate-mapping>
TestSet.java部分:
packagecom.hbsi.test;
import java.util.HashMap;
import java.util.Map;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.hbsi.domain.Student;
import com.hbsi.util.HibernateUtil;
public class TestSet {
public static void main(String[] args) {
// TODO Auto-generated method stub
add();
}
public static void add(){
Session session=null;
Transaction ts=null;
try{
session=HibernateUtil.getSession();
ts=session.beginTransaction();
Student s=new Student();
s.setName("qdqwed");
Map<Long,String>hobbies=new HashMap<Long,String>();
hobbies.put(newLong(10001), "dance");
hobbies.put(newLong(10002), "football");
s.setHobbies(hobbies);
session.save(s);
ts.commit();//添加学生机学生爱好
}finally{
if(session!=null){
session.close();
}
}
}
}
5、<primitive-array>或<array>元素:可以映射类型为数组的属性。但它在实际运用中用地极少【数组类型的集合和list非常相似,因为它也要维护下标索引】
集合映射(set,list, array,bag, map)
l 这些集合类都是Hibernate实现的类和JAVA中的集合类不完全一样,set,list,map分别和JAVA中的Set,List,Map接口对应,bag映射成JAVA的List;这些集合的使用和JAVA集合中对应的接口基本一致;在JAVA的实体类中集合只能定义成接口不能定义成具体类, 因为集合会在运行时被替换成Hibernate的实现。
l 集合的简单使用原则:大部分情况下用set,需要保证集合中的顺序用list,想用java.util.List又不需要保证顺序用bag。
持久化对象在保存时一般不保存与它关联的对象,采用级联操作可以在持久化对象保存时把与它关联的对象一起保存:cascade="save-update"
<set name="emps"cascade="save-update,delete">
<key column="depart_id"></key>
<one-to-many class="Employee"/>
</set>
当不设置cascade属性时,默认值为none,既不级联
Cascade属性的参数可以为:
save-update:在保存和更新时,连带与它关联的对象一起保存和更新
Delete:级联删除,例如:在删除一个部门时,原来在这个部门下的所有人全部删除
All:“同生共死“---全部的级联
Delete-orphan:只在一对多时做,删除孤儿