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ページと結びつけて追加と削除します.