Hibernate笔记之5容器映射之Set映射

容器映射:
  容器常用于存储对象,将容器的关系映射到表主要有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
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值