容器映射:
容器常用于存储对象,将容器的关系映射到表主要有Set,List和Map三种。
例一,Set映射:每个人有很多email地址,但是每个地址是不能重复的,所以选用Set映射:
先建数据库:
-- 删除表
drop table person ;
drop table emails ;
-- 创建表
CREATE TABLE person
(
id INT AUTO_INCREMENT PRIMARY KEY NOT NULL ,
name VARCHAR(20)
) ;
CREATE TABLE emails
(
id INT ,
address VARCHAR(50) ,
foreign key (id) references person(id) on delete cascade
) ;
然后是创建POJO类:Person
package wjr.hibernate.demo20_22;
import java.util.Set;
public class Person {
private Integer id;
private String name;
private Set emails;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set getEmails() {
return emails;
}
public void setEmails(Set emails) {
this.emails = emails;
}
}
现在就是创建映射文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
<class name="wjr.hibernate.demo20_22.Person" table="person" catalog="huanhuan">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native"></generator>
</id>
<property name="name" type="java.lang.String">
<column name="name" length="20" />
</property>
<set name="emails" table="emails" lazy="false">
<key column="id"></key>
<element type="java.lang.String" column="address"></element>
</set>
</class>
</hibernate-mapping>
最后编写操作类:
package wjr.hibernate.demo20_22;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;
public class PersonOperate {
private Session session = null;
public PersonOperate()
{
Configuration config = new Configuration().configure();
session = config.buildSessionFactory().openSession();
}
public void insert(Person p)
{
// 将数据存放到数据库之中
this.session.save(p) ;
// 事务提交
this.session.beginTransaction().commit() ;
}
//更新tel或者zipcode:
public void update(Person p)
{
session.update(p);
session.beginTransaction().commit();
session.close();
}
public List queryAll()
{
String hql = "FROM Person as p" ;
Query q = this.session.createQuery(hql) ;
List l = q.list() ;
return l ;
}
public Person queryById(int i)
{
Person person = null;
String hql = "from Person as p where id=?";
Query q = this.session.createQuery(hql);
q.setInteger(0, i);
List list = new ArrayList();
list = q.list();
if(list.size()>0)
{
person = (Person) list.get(0);
}
return person;
}
//按Id删除,这种删除不能将相关表中的数据级联删除。
public void delete(int id)
{
String hql = "delete from Person where id=?";
Query q = this.session.createQuery(hql);
q.setInteger(0, id);
q.executeUpdate();
this.session.beginTransaction().commit();
session.close();
}
//通过session对象直接删除Person对象,注意和上面删除方式的区别
//这种通过Hibernate提供的delete方法倒是能够一次将相关表中的数据都删除,但是最大缺点就是
//必须先查询出数据,然后再传给delete方法删除,降低了效率。
public void delete(Person p)
{
this.session.delete(p);
this.session.beginTransaction().commit();
session.close();
}
//解决这种删除矛盾最好方法是让数据库自己去管理相应删除操作:
//例如本例中,当创建emails表时,可加一句:
//foreign key (id) references person(id) on delete cascade
}