hibernate(3.6)的添删改查研究

hibernate.cfg.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">

<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>

<session-factory>
	<property name="dialect">org.hibernate.dialect.OracleDialect</property>
	<property name="connection.url">
		jdbc:oracle:thin:@127.0.0.1:1521:orcl
	</property>
	<property name="connection.username">system</property>
	<property name="connection.password">system</property>
	<property name="connection.driver_class">
		oracle.jdbc.driver.OracleDriver
	</property>
	<property name="myeclipse.connection.profile">
		oracle.jdbc.driver.OracleDriver
	</property>
	<property name="format_sql">true</property>
	<property name="show_sql">true</property>
	<property name="connection.pool_size">3</property>


	<mapping resource="event.hbm.xml" />
	<mapping resource="person.hbm.xml" />

</session-factory>

</hibernate-configuration>


 

event.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.main.java.bean">

	<class name="Event" table="lsy_event">
		<id name="id"  type="java.lang.Integer" column="EVENT_ID">
			<generator class="native" />
		</id>
		<property name="date" type="java.util.Date" column="EVENT_DATE" />
		<property name="title" type="java.lang.String"/>
	</class>

</hibernate-mapping>
        


 

person.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.main.java.bean">

	<class name="Person" table="lsy_person">
		<id name="id"  type="java.lang.Integer"  column="PERSON_ID">
			<generator class="increment" />
		</id>
		<property name="age"  type="java.lang.Integer" />
		<property name="firstname"  type="java.lang.String" />
		<property name="lastname"  type="java.lang.String" />


		<set name="events" table="lsy_person_event">
			<key column="PERSON_ID"/>
			<many-to-many column="EVENT_ID" class="Event"/>
		</set>
		
	</class>

</hibernate-mapping>
        


Event.java

 

package com.main.java.bean;

import java.util.Date;

public class Event {
	
	private int id;
	private String title;
	private Date date;

	public Event() {}

	public int getId() {
		return id;
	}

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

	public Date getDate() {
		return date;
	}

	public void setDate(Date date) {
		this.date = date;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

}


Person.java

package com.main.java.bean;

import java.util.HashSet;
import java.util.Set;

public class Person {

	private int id;
    private int age;
    private String firstname;
    private String lastname;
    private Set events = new HashSet();

    public Person() {}
    
    public Set getEvents() {
        return events;
    }

    public void setEvents(Set events) {
        this.events = events;
    }

   

	public int getId() {
		return id;
	}

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

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getFirstname() {
		return firstname;
	}

	public void setFirstname(String firstname) {
		this.firstname = firstname;
	}

	public String getLastname() {
		return lastname;
	}

	public void setLastname(String lastname) {
		this.lastname = lastname;
	}


}


 

 

HibernateSessionFactory,java

 

package com.main.java;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;

/**
 * Configures and provides access to Hibernate sessions, tied to the
 * current thread of execution.  Follows the Thread Local Session
 * pattern, see {@link http://hibernate.org/42.html }.
 */
public class HibernateSessionFactory {

    /** 
     * Location of hibernate.cfg.xml file.
     * Location should be on the classpath as Hibernate uses  
     * #resourceAsStream style lookup for its configuration file. 
     * The default classpath location of the hibernate config file is 
     * in the default package. Use #setConfigFile() to update 
     * the location of the configuration file for the current session.   
     */
    private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
    public static String PUBLIC_CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
	private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
    private  static Configuration configuration = new Configuration();    
    private static org.hibernate.SessionFactory sessionFactory;
    private static String configFile = CONFIG_FILE_LOCATION;

	static {
    	try {
			configuration.configure(configFile);
			sessionFactory = configuration.buildSessionFactory();
		} catch (Exception e) {
			System.err
					.println("%%%% Error Creating SessionFactory %%%%");
			e.printStackTrace();
		}
    }
    private HibernateSessionFactory() {}
	
	/**
     * Returns the ThreadLocal Session instance.  Lazy initialize
     * the <code>SessionFactory</code> if needed.
     *
     *  @return Session
     *  @throws HibernateException
     */
    public static Session getSession() throws HibernateException {
        Session session = (Session) threadLocal.get();

		if (session == null || !session.isOpen()) {
			if (sessionFactory == null) {
				rebuildSessionFactory();
			}
			session = (sessionFactory != null) ? sessionFactory.openSession()
					: null;
			threadLocal.set(session);
		}

        return session;
    }

	/**
     *  Rebuild hibernate session factory
     *
     */
	public static void rebuildSessionFactory() {
		try {
			configuration.configure(configFile);
			sessionFactory = configuration.buildSessionFactory();
		} catch (Exception e) {
			System.err
					.println("%%%% Error Creating SessionFactory %%%%");
			e.printStackTrace();
		}
	}

	/**
     *  Close the single hibernate session instance.
     *
     *  @throws HibernateException
     */
    public static void closeSession() throws HibernateException {
        Session session = (Session) threadLocal.get();
        threadLocal.set(null);

        if (session != null) {
            session.close();
        }
    }

	/**
     *  return session factory
     *
     */
	public static org.hibernate.SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	/**
     *  return session factory
     *
     *	session factory will be rebuilded in the next call
     */
	public static void setConfigFile(String configFile) {
		HibernateSessionFactory.configFile = configFile;
		sessionFactory = null;
	}

	/**
     *  return hibernate configuration
     *
     */
	public static Configuration getConfiguration() {
		return configuration;
	}

}


HibernateUtil.java

 

package com.main.java;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
	private static String LSY_CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
	private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {
            // Create the SessionFactory from hibernate.cfg.xml
            return new Configuration().configure(LSY_CONFIG_FILE_LOCATION).buildSessionFactory();
        	
//            return HibernateSessionFactory.getSessionFactory();
            
        }
        catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    

}

 

2012-04-08我修改了这个类,加入了批量新增和批量修改的例子
 

EventManager.java

 

package com.main.java.event;

import java.util.Date;
import java.util.List;

import org.hibernate.CacheMode;
import org.hibernate.ScrollMode;
import org.hibernate.ScrollableResults;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import spring.container.SpringContainer;

import com.main.java.HibernateSessionFactory;
import com.main.java.HibernateUtil;
import com.main.java.bean.Event;
import com.main.java.bean.Person;

/**
 * 本例主要实验hibernate的添删改查,研究其特点,所以都是单表操作
 * @author Administrator
 *
 */
public class EventManager {

	public static void main(String[] args) {
		EventManager mgr = new EventManager();

		// 作为测试,我们只用Event做添删改查

		//1 新增
//		mgr.createAndStoreEvent("My Event88", new Date());
//		mgr.createAndStoreEvent("My Event2", new Date());
		
		//批量插入
//		mgr.createAndStoreEventBatch();
		//插入1万条数据,耗时:消耗时间13秒,打印台打印如下:
		//消耗时间;
		//13
		
		// 2查询
//		List list=mgr.selectEvent("My Event1");
//		System.out.println(list.size());
		
		//3-1删除
//		Event e1=new Event();
//		e1.setTitle("My Event");
//		//直接删除对象,其条件是id(主键)必须知道;
//		//不给主键的值,hibernate就删不了,可以先查询再删除
//		e1.setId(3);
//		mgr.deleteEvent(e1);
		
		//3-2删除
//		mgr.deleteEventById(4);//这里我直接把id传入了,你可以先查询
		
		//4-1修改
//		Event e2=new Event();
		//e2.setTitle("My Ev1");
		//同样,hibernate要update也必须知道id,
		//因为其默认的where条件就是: where id(主键)=?
		//另外要注意,hibernate默认把你给的对象的所有属性都更新,
		//你没给其他属性复制的话,最后其他属性都被更新成null了!
		//e2.setId(11);
//		mgr.updateEvent(e2);
		//如果你知道某个实例的持久化标识(identifier),你就可以使用 Session 的 load() 方法来获取它
		//我们把上面都注掉
		
//		Event e2=new Event();
		
//		mgr.updateEventLoad(11);//使用load方法
//		mgr.updateEventLoadObject(e2,11);//使用load方法
//		mgr.updateEventGet(11);//使用get方法
		
		/*
		 从上面的例子可以看出,hibernate的更新操作必须知道id,
		 因为这是where条件所必需的。
		 所以自然而然就分几种情况:
		 1,我知道id,给这个对象赋上值调用update方法就可以了;
		 2,我知道id,也确定session有这个对象(没有的话最后它去数据库查找),
		    就可以使用load方法。
		 3,我知道id,让它去数据库查找这个对象。
		 这3中方式无非就是先查找,找到后你再修改它的值,然后再调用update语句,
		 不同的只是查找的方式而已。
		 */
		
		
		//4-2修改
//		Event e3=new Event();
//		e3.setTitle("My Event345");
		//同样,hibernate要update也必须知道id,
		//因为其默认的where条件就是: where id(主键)=?
		//另外要注意,hibernate默认把你给的对象的所有属性都更新,
		//你没给其他属性复制的话,最后其他属性都被更新成null了!
//		e3.setId(7);
//		mgr.updateEventBySql(e3);
		
		
		//批量操作
		
		//批量修改
		mgr.updateEventBatch();
		//测试数据1万条,耗时6秒,控制台输出如下:
		//消耗时间;
		//6

		//最后关闭sessionFactory
		HibernateUtil.getSessionFactory().close();
	}

	/**
	 * 新增event对象
	 * 主键生成为"native",若报没有***序列,你到数据库建一个这样的序列
	 * @param title
	 * @param theDate
	 */
	private void createAndStoreEvent(String title, Date theDate) {
		// 最原始的写法,这样很繁琐
		// Configuration configuration = new Configuration();
		// SessionFactory sfc = configuration.configure(
		// HibernateSessionFactory.PUBLIC_CONFIG_FILE_LOCATION)
		// .buildSessionFactory();
		// Session session =sfc.openSession();

		// 使用封装的HibernateUtil就很简洁
		// Session session =
		// HibernateUtil.getSessionFactory().openSession();//测试成功

		// 使用封装的HibernateSessionFactory就很简洁
		Session session = HibernateSessionFactory.getSessionFactory()
				.openSession();

		session.beginTransaction();

		Event theEvent = new Event();
		theEvent.setTitle(title);
		theEvent.setDate(theDate);
		session.save(theEvent);

		session.getTransaction().commit();
		session.close();
		
//		HibernateUtil.getSessionFactory().close();
		
	}
	
	/**
	 * 新增event对象,批量插入测试(测试1万条数据)
	 * 主键生成为"native",若报没有***序列,你到数据库建一个这样的序列
	 * @param title
	 * @param theDate
	 */
	private void createAndStoreEventBatch() {
		// 最原始的写法,这样很繁琐
		// Configuration configuration = new Configuration();
		// SessionFactory sfc = configuration.configure(
		// HibernateSessionFactory.PUBLIC_CONFIG_FILE_LOCATION)
		// .buildSessionFactory();
		// Session session =sfc.openSession();

		// 使用封装的HibernateUtil就很简洁
		// Session session =
		// HibernateUtil.getSessionFactory().openSession();//测试成功

		// 使用封装的HibernateSessionFactory就很简洁
		Session session = HibernateSessionFactory.getSessionFactory()
				.openSession();

		session.beginTransaction();
		Date dd1=new Date();
        //1万数据
		for(int i=0;i<10000;i++){
			Event theEvent = new Event();
			theEvent.setTitle("title-"+i);
			theEvent.setDate(new Date());
			session.save(theEvent);
			if(i%20==0){ //每一批20条数据就插入
		        session.flush();
		        session.clear();
		        System.out.println("刷新session--"+i);
		    }

		}
		Date dd2=new Date();
		System.out.println("消耗时间;");
		System.out.println((dd2.getTime()-dd1.getTime())/1000);

		session.getTransaction().commit();
		session.close();
		
//		HibernateUtil.getSessionFactory().close();
		
	}

	/**
	 * 查询event对象
	 * 
	 * @param title
	 * @param theDate
	 */
	private List selectEvent(String title) {

		// 使用封装的HibernateUtil就很简洁
		Session session = HibernateUtil.getSessionFactory().openSession();// 测试成功

		session.beginTransaction();

//		Event theEvent = new Event();
//		theEvent.setTitle(title);
		
		List res=session.createSQLQuery("select * from lsy_event b where b.title='"+title+"'").list();

		session.getTransaction().commit();
		session.close();
		
//		HibernateUtil.getSessionFactory().close();
		
		return res;
	}
	
	/**
	 * 删除event对象
	 * 
	 * @param title
	 * @param theDate
	 */
	private void deleteEvent(Event theEvent) {

		// 使用封装的HibernateUtil就很简洁
		Session session = HibernateUtil.getSessionFactory().openSession();// 测试成功

		session.beginTransaction();
		
		session.delete(theEvent);
		System.out.println("here deleting~~~");

		session.getTransaction().commit();
		session.close();
		
//		HibernateUtil.getSessionFactory().close();
		
	}
	
	/**
	 * id删除event对象
	 * 
	 * @param title
	 * @param theDate
	 */
	private void deleteEventById(int id) {

		// 使用封装的HibernateUtil就很简洁
		Session session = HibernateUtil.getSessionFactory().openSession();// 测试成功

		session.beginTransaction();
		
		String hql="delete from lsy_event b where b.event_id="+id;
		session.createSQLQuery(hql).executeUpdate();
		System.out.println("here SQL deleting~~~");

		session.getTransaction().commit();
		session.close();
		
//		HibernateUtil.getSessionFactory().close();
		
	}
	
	/**
	 * 修改event对象
	 * 
	 * @param title
	 * @param theDate
	 */
	private void updateEvent(Event theEvent) {

		// 使用封装的HibernateUtil就很简洁
//		Session session = HibernateUtil.openSession();// 测试成功
		
		SessionFactory sessionFactory=(SessionFactory)SpringContainer.getBean("sessionFactory");
		
		Session session=sessionFactory.openSession();
		
		session.beginTransaction();
		
		session.update(theEvent);
		System.out.println("here updating~~~");

		session.getTransaction().commit();
		session.close();
		
		
	}
	
	/**
	 * 批量修改event对象(测试1万条数据)
	 * 
	 * @param title
	 * @param theDate
	 */
	private void updateEventBatch() {

		// 使用封装的HibernateUtil就很简洁
//		Session session = HibernateUtil.openSession();// 测试成功
		
		SessionFactory sessionFactory=(SessionFactory)SpringContainer.getBean("sessionFactory");
		Session session=sessionFactory.openSession();
		session.beginTransaction();
		
		Date dd1=new Date();
		ScrollableResults eventlist = session.createQuery("select e from Event e ")
	    .setCacheMode(CacheMode.IGNORE)
	    .scroll(ScrollMode.FORWARD_ONLY);
	    int count=0;
	    while ( eventlist.next() ) {
		    Event ee = (Event) eventlist.get(0);//注意这里确实是0,不是其他。为什么我也不清楚。
		    ee.setTitle("new-title"+count);
		    if ( ++count % 20 == 0 ) {
		        //flush a batch of updates and release memory:
		        session.flush();
		        session.clear();
		        System.out.println("刷新session--"+count);
		    }
	    }
	    Date dd2=new Date();
		System.out.println("消耗时间;");
		System.out.println((dd2.getTime()-dd1.getTime())/1000);
		
		session.getTransaction().commit();
		session.close();
		
		
	}
	/**
	 * 修改event对象,使用load方法
	 * 如果你知道某个实例的持久化标识(identifier),你就可以使用 Session 的 load() 方法来获取它
	 * @param title
	 * @param theDate
	 */
	private void updateEventLoad(int id) {

		// 使用封装的HibernateUtil就很简洁
//		Session session = HibernateUtil.openSession();// 测试成功
		
		SessionFactory sessionFactory=(SessionFactory)SpringContainer.getBean("sessionFactory");
		
		Session session=sessionFactory.openSession();
		
		session.beginTransaction();
		
		Event theEvent2=(Event)session.load(Event.class, id);
		theEvent2.setTitle("loadtttt");
		System.out.println("here updating~~~");

		session.getTransaction().commit();
		session.close();
		
		
	}
	/**
	 * 修改event对象,使用load方法,传入对象
	 * 如果你知道某个实例的持久化标识(identifier),你就可以使用 Session 的 load() 方法来获取它
	 * @param title
	 * @param theDate
	 */
	private void updateEventLoadObject(Event ev,int id) {

		// 使用封装的HibernateUtil就很简洁
//		Session session = HibernateUtil.openSession();// 测试成功
		
		SessionFactory sessionFactory=(SessionFactory)SpringContainer.getBean("sessionFactory");
		
		Session session=sessionFactory.openSession();
		
		session.beginTransaction();
		
		session.load(ev, id);
		ev.setTitle("loadooooo");
		System.out.println("here updating~~~");

		session.getTransaction().commit();
		session.close();
		
		
	}
	/**
	 * 修改event对象,使用load方法,传入对象
	 * 如果你不确定是否有匹配的行存在,应该使用 get() 方法,它会立刻访问数据库,如果没有对应的记录,会返回 null。
	 * @param title
	 * @param theDate
	 */
	private void updateEventGet(int id) {

		// 使用封装的HibernateUtil就很简洁
//		Session session = HibernateUtil.openSession();// 测试成功
		
		SessionFactory sessionFactory=(SessionFactory)SpringContainer.getBean("sessionFactory");
		
		Session session=sessionFactory.openSession();
		
		session.beginTransaction();
		
		Event ee=(Event)session.get(Event.class, id);
		ee.setTitle("get");
		System.out.println("here updating~~~");

		session.getTransaction().commit();
		session.close();
		
		
	}
	/**
	 * Sql修改event对象
	 * 
	 * @param title
	 * @param theDate
	 */
	private void updateEventBySql(Event theEvent) {

		// 使用封装的HibernateUtil就很简洁
		Session session = HibernateUtil.getSessionFactory().openSession();// 测试成功

		session.beginTransaction();
		
		String sql=" update lsy_event d set d.title='"+theEvent.getTitle()+"'" +
				" where d.event_id="+theEvent.getId();
		
		session.createSQLQuery(sql).executeUpdate();
		System.out.println("here SQL updating~~~");

		session.getTransaction().commit();
		session.close();
		
//		HibernateUtil.getSessionFactory().close();
		
	}
	
	
}


 

 

 


 

 数据库设计:

-- Create table
create table LSY_EVENT
(
  event_id   char(32),
  event_date date,
  title      varchar2(32)
)
tablespace USERS
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );
-- Create/Recreate primary, unique and foreign key constraints 
alter table LSY_EVENT
  add constraint evente_pk primary key (EVENT_ID);



-- Create table
create table LSY_PERSON
(
  person_id char(32),
  age       number,
  firstname varchar2(32),
  lastname  varchar2(32)
)
tablespace USERS
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );
-- Add comments to the table 
comment on table LSY_PERSON
  is '人员表';
-- Create/Recreate primary, unique and foreign key constraints 
alter table LSY_PERSON
  add constraint person_pk primary key (PERSON_ID);




-- Create table
create table LSY_PERSON_EVENT
(
  event_id  char(32),
  person_id char(32)
)
tablespace USERS
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );
-- Add comments to the table 
comment on table LSY_PERSON_EVENT
  is '人员事件关联表';
-- Create/Recreate primary, unique and foreign key constraints 
alter table LSY_PERSON_EVENT
  add constraint person_event_f1_person foreign key (PERSON_ID)
  references lsy_person (PERSON_ID);
alter table LSY_PERSON_EVENT
  add constraint person_event_f1_event foreign key (EVENT_ID)
  references lsy_event (EVENT_ID);


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值