基于JPA的CRUD(OneToMany)

 

基于JPA的CRUD(OneToMany)

原文地址

先建数据库:
use test;

create table person
(
id 
int  primary key AUTO_INCREMENT,
username varchar(
20 ) not  null ,
password varchar(
20 ) not  null
);

create table mail
(
id 
int  primary KEY AUTO_INCREMENT,
email varchar(
50 ) not  null ,
pid 
int   null
);
select 
*  from person;
select 
*  from mail;
Person表和Mail表不存在物理方面的OneToMany关系,这
种关系是通过Hibernate来维护的.
hibernate.cgf.xml:
<? xml version = " 1.0 "  encoding = " UTF-8 " ?>
<! DOCTYPE hibernate - configuration PUBLIC
    
" -//Hibernate/Hibernate Configuration DTD 3.0//EN "
    
" http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd " >
< hibernate - configuration >
    
< session - factory >
        
< property name = " dialect " >
            org.hibernate.dialect.MySQLDialect
        
</ property >
        
< property name = " show_sql " > true </ property >
        
< property name = " myeclipse.connection.profile " > mysql </ property >
        
< property name = " connection.url " >
            jdbc:mysql:
// localhost/test
         </ property >
        
< property name = " connection.username " > root </ property >
        
< property name = " connection.password " > root </ property >
        
< property name = " connection.driver_class " >
            com.mysql.jdbc.Driver
        
</ property >
        
< property name = " transaction.flush_before_completion " > true </ property >
        
< mapping  class = " com.vo.Person "   />
        
< mapping  class = " com.vo.Mail "   />
    
</ session - factory >
</ hibernate - configuration >

Person.java:
package  com.vo;

import  java.io.Serializable;
import  java.util.HashSet;
import  java.util.Set;
import  javax.persistence.CascadeType;
import  javax.persistence.Column;
import  javax.persistence.Entity;
import  javax.persistence.FetchType;
import  javax.persistence.GeneratedValue;
import  javax.persistence.GenerationType;
import  javax.persistence.Id;
import  javax.persistence.JoinColumn;
import  javax.persistence.OneToMany;
import  javax.persistence.Table;

@SuppressWarnings(
" serial " )
@Entity
@Table(name 
=   " person " )
public   class  Person  implements  Serializable
{
    
    
private Integer id;
    
private String username;
    
private String password;
    
private Set<Mail> mails = new HashSet<Mail>();
    @OneToMany(cascade
=CascadeType.ALL,fetch=FetchType.LAZY) //映射为单一对多关系
    
//@Basic(fetch=FetchType.LAZY) //和上面的fecth一样的效果,都是延时初始
    @JoinColumn(name="pid")             //加入要映射的列(外键列)
    public Set<Mail> getMails()
    
{
        
return mails;
    }


    
public void setMails(Set<Mail> mails)
    
{
        
this.mails = mails;
    }

    @Id
    @GeneratedValue(strategy 
= GenerationType.AUTO)
    @Column(name
="id")
    
public Integer getId()
    
{
        
return id;
    }


    
public void setId(Integer id)
    
{
        
this.id = id;
    }


    
public String getUsername()
    
{
        
return username;
    }

    @Column(name
="username",nullable=false)
    
public void setUsername(String username)
    
{
        
this.username = username;
    }

    @Column(name
="password",nullable=false)
    
public String getPassword()
    
{
        
return password;
    }


    
public void setPassword(String password)
    
{
        
this.password = password;
    }

}


Mail.java:
package  com.vo;

import  java.io.Serializable;

import  javax.persistence.Column;
import  javax.persistence.Entity;
import  javax.persistence.GeneratedValue;
import  javax.persistence.GenerationType;
import  javax.persistence.Id;
import  javax.persistence.Table;

@SuppressWarnings(
" serial " )
@Entity
@Table(name 
=   " mail " )
public   class  Mail  implements  Serializable
{
    
    
private Integer id;
    
private String email;

    @Id
    @GeneratedValue(strategy 
= GenerationType.AUTO)
    @Column(name
="id")
    
public Integer getId()
    
{
        
return id;
    }


    
public void setId(Integer id)
    
{
        
this.id = id;
    }

    @Column(name
="email",nullable=false)
    
public String getEmail()
    
{
        
return email;
    }


    
public void setEmail(String email)
    
{
        
this.email = email;
    }

}


测试类:
package  com.test;

import  java.util.Iterator;
import  java.util.Set;

import  org.hibernate.Session;
import  org.hibernate.Transaction;
import  org.hibernate.cfg.AnnotationConfiguration;
import  org.junit.After;
import  org.junit.Before;
import  org.junit.Test;

import  com.vo.Mail;
import  com.vo.Person;

public   class  PersonTest
{
    
private Session session;
    
private Transaction transaction;

    @Before
    
public void before()
    
{
        session 
= new AnnotationConfiguration().configure()
                .buildSessionFactory().openSession();
        transaction 
= session.getTransaction();
    }


    @After
    
public void after()
    
{
        session.close();
    }

    
    @Test
    
public void save()
    
{
        transaction.begin();
        Person person 
= new Person();
        person.setUsername(
"zdw");
        person.setPassword(
"admin");
        
        Mail m1 
= new Mail();
        m1.setEmail(
"a@live.com");
        Mail m2 
= new Mail();
        m2.setEmail(
"b@live.com");
        
        person.getMails().add(m1);
        person.getMails().add(m2);
        session.save(person);
        transaction.commit();
    }

    
    
    @Test
    
public void findById()
    
{
        Person person 
= (Person) session.load(Person.class1);
        Set
<Mail> mails = person.getMails();
        
if(mails.size() > 0)
        
{
            
for(Iterator<Mail> i = mails.iterator(); i .hasNext();)
            
{
                Mail m 
= i.next();
                System.out.println(m.getEmail());
            }

        }

    }

    
    
    @Test
    
public void delete()
    
{
        transaction.begin();
        Person person 
= (Person) session.load(Person.class1);
        session.delete(person);
        transaction.commit();
    }

}

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值