JAva webゼロ単列地20期「Hibernate」基本フロー



1.新規パッケージcom.hibernate.util、クラスHibernateUtil.javaの追加
package com.hibernate.util;

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

public class HibernateUtil {
	
	private static SessionFactory sessionFactory;

	static 
	{
		try
		{
		     sessionFactory = new Configuration().configure().buildSessionFactory();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
	
	public static Session currentSession()
	{
		Session session =  sessionFactory.openSession();
		
		return session;
	}
	
	public static void closeSession(Session session)
	{
		if(session!=null)
		{
			session.close();
		}
	}

}

このコードは主にsessionの作成と削除を完了します.まず、コードブロックを分析します.
private static SessionFactory sessionFactory;
 
SessionFactoryを宣言します.SessionFactoryとは何ですか.
SessionFactoryインタフェース:SessionFactoryインタフェースはHibernateの初期化を担当します.データ・ストレージ・ソースのエージェントとして機能し、セッション・オブジェクトの作成を担当します.ここでは工場モードを使いました.SessionFactoryは軽量レベルではありません.一般的に、1つのプロジェクトは通常1つのSessionFactoryだけで十分です.複数のデータベースを操作する必要がある場合は、各データベースに1つのSessionFactoryを指定できます.
 
static  {   try   {        sessionFactory = new Configuration().configure().buildSessionFactory();   }   catch(Exception e)   {    e.printStackTrace();   }  }
静的コードブロックは、最初に実行されます.ここでの機能は、主に新しいsessionFactoryを作成することです.コンフィギュレーションインタフェースの役割は、Hibernateを構成し、それを起動することです.Hibernateの起動中に、コンフィギュレーションクラスのインスタンスは、まずマッピングドキュメントの場所を特定し、これらの構成を読み取り、SessionFactoryオブジェクトを作成します.コンフィギュレーションインタフェースは、Hibernateプロジェクト全体で小さな役割を果たしていますが、hibernateを起動するときに遭遇するすべてのオブジェクトです.
 
3.public static Session currentSession()  {   Session session =  sessionFactory.openSession();      return session;  }  SessionインタフェースはHibernate開発者にとって最も重要なインタフェースです.しかしHibernateでは、インスタンス化されたSessionは軽量クラスであり、多くのリソースを使用することはありません.これは、お客様のプログラムでは、Sessionオブジェクトが作成および破棄され続ける可能性があるため、実際のプロジェクトでは重要です.Sessionのオーバーヘッドが大きすぎる場合、システムに悪影響を及ぼす可能性があります.ただし、Sessionオブジェクトは非スレッドで安全であることに注意してください.したがって、あなたの設計では、1つのスレッドで1つのSessionオブジェクトのみを作成することが望ましいです.Hibernateの設計者の頭の中で、sessionはデータ接続とトランザクション管理の中間インタフェースと見なしています.sessionは永続的なオブジェクトとして想像できます.のバッファで、Hibernateはこれらの永続オブジェクトの変更を検出し、データベースをタイムリーにリフレッシュすることができます.Sessionは、データベースに永続オブジェクトを格納したり、データベースから取得したりするなどの永続レイヤ関連の操作を含むため、永続レイヤマネージャとも呼ばれます.HibernateのsessionはJSPアプリケーションのHttpSessionとは異なります..セッションという用語を使用する場合、Hibernateのセッションを指しますが、HttpSesionオブジェクトは後でユーザーセッションと呼ばれます.
2.新規パッケージcom.hibernate.persistence新規クラスUserDB:
package com.hibernate.persistence;


import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.hibernate.model.User;
import com.hibernate.util.HibernateUtil;

public class UserDB
{

	public static void  save(User user)
	{
	  Session session	 = HibernateUtil.currentSession();
	 Transaction tx = session.beginTransaction();
	 try
	{
		session.save(user);
		tx.commit();
	}
	catch (Exception ex)
	{
		System.out.println("        ");
		if(null!=tx)
			tx.rollback();
		// TODO: handle exception
	}
	 finally
	 {
		 HibernateUtil.closeSession(session);
	 }
	}
	//       
	@SuppressWarnings("unchecked")
	public static List<User> listall()
	{
		List<User> list = null;
		 Session session	 = HibernateUtil.currentSession();
		 Transaction tx = session.beginTransaction();
		 try
		{
			Query query = session.createQuery("from User");//HQL   ,     ,      
			
			 list =(List<User>) query.list();
			 
			 
			tx.commit();
		}
		catch (Exception ex)
		{
			System.out.println("        ");
			if(null!=tx)
				tx.rollback();
			// TODO: handle exception
		}
		 finally
		 {
			 HibernateUtil.closeSession(session);
		 }
		 return list;
	}
	public static User getUserById(Integer Id)
	{
		User user =null;
		 Session session	 = HibernateUtil.currentSession();
		 Transaction tx = session.beginTransaction();
		 try
		{
			//Query query = session.createQuery("from User where id=username");//HQL   ,     ,      
			 //Object get(Class clazz, Serializable id) 
			 
			 user =(User)session.get(User.class, Id);	 
			 
			tx.commit();
		}
		catch (Exception ex)
		{
			System.out.println("getUserById    ");
			if(null!=tx)
				tx.rollback();
			// TODO: handle exception
		}
		 finally
		 {
			 HibernateUtil.closeSession(session);
		 }
		 return user;
	}
	public static void removeById(int id)
	{
		Session session = HibernateUtil.currentSession();
		
		Transaction ts = session.beginTransaction();
		User user = null;
		try
		{
			user   = (User)session.get(User.class, id);
			
			session.delete(user);
			
			ts.commit();
		}
		catch (Exception e)
		{
			// TODO: handle exception
			if(null!=ts)
			{
			ts.rollback();
			}
		}
			
	}
}

データに触れたことがある学生には理解しにくいはずですが、中にはTransactionが現れています.彼は事務であり、commitメソッドを実行して提出しています.
 
3.com.test.actionパッケージを新規作成し、クラスUserActionを追加:
package com.test.action;


import java.util.List;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.hibernate.model.User;
import com.hibernate.persistence.UserDB;
import com.opensymphony.xwork2.ActionSupport;
import com.sun.xml.internal.ws.resources.HttpserverMessages;

public class UserAction extends ActionSupport
{
	
	 public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	private String username;
	
	 private String password;
	
	//         
	public String save() throws Exception
	{
		User user = new User();
		user.setUsername(username);

		user.setPassword(password);
		

		
		UserDB.save(user);//       
		
		List<User> list = UserDB.listall();
		
		HttpServletRequest request = ServletActionContext.getRequest();
		
		request.setAttribute("list", list);
		
		return SUCCESS;
	}
	public String getUser() throws Exception
	{
		User user = UserDB.getUserById(username);
		
		HttpServletRequest request = ServletActionContext.getRequest();
		
		request.setAttribute("user", user);
		
		return SUCCESS;
		
		
	}
	public String deleteUser()  throws Exception
	{
		UserDB.removeById(username);
		
		List<User> list =UserDB.listall();
		
		HttpServletRequest request = ServletActionContext.getRequest();
		
		request.setAttribute("list", list);
		
		return SUCCESS;
	}	
}

4.struts.xmlファイル:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtd/struts-2.0.dtd">
<struts>
<package name="hibernate" extends="struts-default">
  <action name="save"  class="com.test.action.UserAction" method="save">
    <result name="success" >/listAll.jsp</result>
  </action>
  
  <action name="getUser"  class="com.test.action.UserAction" method="getUser">
    <result name="success">/getPerson.jsp</result>
  </action>
  
  <action name="deleteUser"  class="com.test.action.UserAction" method="deleteUser">
    <result name="success">/listAll.jsp</result>
  </action>
</package>
</struts>

listall.jsp  getPersion.jspはまだ追加されていないので、次号で一緒に説明します.
この期は内容が多いので、ここでまず学生たちに消化させ、次の期はjspページと結びつけて追加と削除します.