1).有一个默认的构造方法;
2).所有的属性都有setter和getter方法
3).有一个对象标识符Oid;
4).如果有集合属性,则必须定义成接口类型:List、Set、Map。不能定义成类类型HashSet、hashMap、ArrayList等
1. Hibernate 高级映射
- 元素:可以映射java.util.List接口的属性,有顺序,需要在集合属性对应的表中用一个额外的索引保存每个元素的位置。
2. 这几个高级映射的主要代码
private Set hobbies;
这里要注意的是:这里所说的set标签不同于前面介绍过的关系映射中的set标签,不知大家注意到没有,这里多了一个element标签但是没有关系类型的标签了;element标签的属性not-null=”true”是不允许字段为空的意思
- 元素
private List hobbies;
这里要注意的是:list标签与set的标签的映射文件写法看似一样,其实不一样,有一点不同的是,list标签多了list-index标签,这个标签的作用是给表添加一个索引位置,为什么会有多一个这个标签呢!?其实是由list与set的不同决定的,li。st是 有顺序的所以要有一个索引位置来唯一标识,而set没有。
private Collection hobbies;
这里要注意的是:bag标签的作用是达到与list标签同样的功能,但是不多余的产生索引位置的标识。bag标签对应的持久化类中的属性类型是Collection集合类型,即是set、list的父接口,固后者达到的功能前者都能达到。bag主要作用是:想使数据又顺序,但是又不想要那个产生的标识位置的字段。
private Map hobbies;
3. 案例分析
以上是各个xxx.hbm.xml的部分代码,也是核心代码,下面列举一下测试代码。
SetTest.
Java
package com.hbsi.set;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
import org.junit.Test;
import com.hbsi.utils.HibernateSessionFactory;
public class SetTest {
@Test
public void add(){
Session session = HibernateSessionFactory.getSession();
session.beginTransaction();
Person p = new Person();
p.setName("keven");
Set hobbies = new HashSet();
hobbies.add("sing");
hobbies.add("dance");
p.setHobbies(hobbies);
session.save(p);
session.getTransaction().commit();
HibernateSessionFactory.closeSession();
}
}
ListTest.java
package com.hbsi.list;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Session;
import org.junit.Test;
import com.hbsi.utils.HibernateSessionFactory;
public class ListTest {
@Test
public void add(){
Session session = HibernateSessionFactory.getSession();
session.beginTransaction();
Person p = new Person();
p.setName("join");
List hobbies = new ArrayList();
hobbies.add("backetball");
hobbies.add("football");
p.setHobbies(hobbies);
session.save(p);
session.getTransaction().commit();
HibernateSessionFactory.closeSession();
}
}
BagTest.java
package com.hbsi.bag;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Session;