gpt4 book ai didi

java - 集成 Struts 2 和 hibernate 的最佳方法

转载 作者:行者123 更新时间:2023-12-02 07:40:46 25 4
gpt4 key购买 nike

我打算集成hibernate和struts2。请告知哪种方法最好,我想在 Struts2 中,没有官方插件来集成 Hibernate 框架。但是,您可以通过以下步骤解决:

  1. 注册自定义 ServletContextListener。
  2. 在 ServletContextListener 类中,初始化 Hibernate session 并将其存储到 servlet 上下文中。
  3. 在操作类中,从 servlet 上下文获取 Hibernate session ,并正常执行 Hibernate 任务。

请告知我用于初始化 Hibernate session 工厂的 Servlet 上下文方法是可以的,或者也可以有其他最佳方法。这是该项目的快照。

这是一段代码..

模型类...

package com.mkyong.customer.model;

import java.util.Date;

public class Customer implements java.io.Serializable {

private Long customerId;
private String name;
private String address;
private Date createdDate;

//getter and setter methods
}

hbm 映射文件..

<hibernate-mapping>
<class name="com.mkyong.customer.model.Customer"
table="customer" catalog="mkyong">

<id name="customerId" type="java.lang.Long">
<column name="CUSTOMER_ID" />
<generator class="identity" />
</id>
<property name="name" type="string">
<column name="NAME" length="45" not-null="true" />
</property>
<property name="address" type="string">
<column name="ADDRESS" not-null="true" />
</property>
<property name="createdDate" type="timestamp">
<column name="CREATED_DATE" length="19" not-null="true" />
</property>
</class>
</hibernate-mapping>

配置文件是...

<hibernate-configuration>
<session-factory>
<property name="hibernate.bytecode.use_reflection_optimizer">false</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mkyong</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="use_sql_comments">false</property>
<mapping resource="com/mkyong/customer/hibernate/Customer.hbm.xml" />
</session-factory>
</hibernate-configuration>

监听器类...

package com.mkyong.listener;

import java.net.URL;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

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

public class HibernateListener implements ServletContextListener{

private Configuration config;
private SessionFactory factory;
private String path = "/hibernate.cfg.xml";
private static Class clazz = HibernateListener.class;

public static final String KEY_NAME = clazz.getName();

public void contextDestroyed(ServletContextEvent event) {
//
}

public void contextInitialized(ServletContextEvent event) {

try {
URL url = HibernateListener.class.getResource(path);
config = new Configuration().configure(url);
factory = config.buildSessionFactory();

//save the Hibernate session factory into serlvet context
event.getServletContext().setAttribute(KEY_NAME, factory);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}

最后是 Action 类..

ackage com.mkyong.customer.action;

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

import org.apache.struts2.ServletActionContext;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

import com.mkyong.customer.model.Customer;
import com.mkyong.listener.HibernateListener;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class CustomerAction extends ActionSupport
implements ModelDriven{

Customer customer = new Customer();
List<Customer> customerList = new ArrayList<Customer>();

public String execute() throws Exception {
return SUCCESS;
}

public Object getModel() {
return customer;
}

public List<Customer> getCustomerList() {
return customerList;
}

public void setCustomerList(List<Customer> customerList) {
this.customerList = customerList;
}

//save customer
public String addCustomer() throws Exception{

//get hibernate session from the servlet context
SessionFactory sessionFactory =
(SessionFactory) ServletActionContext.getServletContext()
.getAttribute(HibernateListener.KEY_NAME);

Session session = sessionFactory.openSession();

//save it
customer.setCreatedDate(new Date());

session.beginTransaction();
session.save(customer);
session.getTransaction().commit();

//reload the customer list
customerList = null;
customerList = session.createQuery("from Customer").list();

return SUCCESS;

}

//list all customers
public String listCustomer() throws Exception{

//get hibernate session from the servlet context
SessionFactory sessionFactory =
(SessionFactory) ServletActionContext.getServletContext()
.getAttribute(HibernateListener.KEY_NAME);

Session session = sessionFactory.openSession();

customerList = session.createQuery("from Customer").list();

return SUCCESS;

}
}

伙计们,请发布更新的代码,非常感谢,我被困在这个问题上..!!

最佳答案

我对阅读标题感到困惑,因为它提到了 Spring 和 Hibernate,但读完后,结果是 Struts2 和 Hibernate。以下是我对您的输入的快速想法

Struts2 用于 Web 层作为 MVC 框架,而 Hibernate 负责处理数据库交互,尽管您始终可以使用两者,并且可以在 Struts2 操作中注入(inject) hibernate session ,但我不会建议您采用这种方法。我的建议是创建一个服务层,它应该负责 Struts2 操作类和 Hibernate 层之间的交互,这将帮助您微调代码,并使您更轻松地进行任何代码更改或任何修改 future 。

Struts2 中已经有一个插件,允许您在操作类中注入(inject) Hibernate session

  1. full-hibernate-plugin-for-struts2/

但我仍然认为不要将 hibernate session 与 Struts2 操作混合在一起,最好在两者之间放置一个服务层来做到这一点。

此外,由于您已经使用 Spring 标记了您的问题,所以我相信您也在您的应用程序中使用 Spring,因此最好让 Spring 处理您与 Hibernate 的交互,同时引入服务层将帮助您高效且高效地进行事务划分尽可能微调。

关于java - 集成 Struts 2 和 hibernate 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11635487/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com