- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个简单的 Java Web 应用程序,它从数据库接收一些信息并在 Web 浏览器中显示该信息。 Hibernate 用于与 servlet 和 jsp 文件中的数据库进行交互。一切都如我所愿,但我不明白一些事情。
数据库很简单 - 2 个表:问题和答案。表之间的关系是一对多:一个问题可以有多个答案。
这是java类的代码问题和答案:
问题.java
package app;
import java.util.Set;
public class Question {
Long id = null;
String text = "";
Set<Answer> answers = null;
public Question() {
}
public void setId(Long id) {
this.id = id;
}
public void setText(String text) {
this.text = text;
}
public void setAnswers(Set<Answer> answers) {
this.answers = answers;
}
public Long getId() {
return id;
}
public String getText() {
return text;
}
public Set<Answer> getAnswers() {
return answers;
}
}
Answer.java
package app;
public class Answer {
Long id = null;
String text = "";
Question question = null;
public Answer() {
}
public void setId(Long id) {
this.id = id;
}
public void setText(String text) {
this.text = text;
}
public void setQuestion(Question question) {
this.question = question;
}
public Long getId() {
return id;
}
public String getText() {
return text;
}
public Question getQuestion() {
return question;
}
}
这是 Hibernate 的配置:
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
<property name="hibernate.connection.url">jdbc:sqlserver://localhost;databaseName=Test</property>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.current_session_context_class">thread</property>
<mapping resource="question.hbm.xml"/>
<mapping resource="answer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
question.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="app">
<class name="app.Question" table="Question">
<id column="id" name="id" type="java.lang.Long">
<generator class="native"/>
</id>
<property column="text" name="text" not-null="true" type="java.lang.String"/>
<set name="answers">
<key column="question_id"/>
<one-to-many class="app.Answer"/>
</set>
</class>
</hibernate-mapping>
answer.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="app">
<class name="app.Answer" table="Answer">
<id column="id" name="id" type="java.lang.Long">
<generator class="native"/>
</id>
<property column="text" name="text" not-null="true" type="java.lang.String"/>
<many-to-one class="app.Question" column="question_id" name="question" not-null="true"/>
</class>
</hibernate-mapping>
所以在问题中有一个答案的集合。因此,将会有一个懒惰的答案加载。我想在 jsp 文件中使用 Hibernate 对象,因此我使用 this technique :过滤器用于创建一个 session ,该 session 在servlet和相应的jsp文件中都使用。
这是我的过滤器的代码:
HibernateFilter.java
package app;
import java.io.IOException;
import javax.servlet.*;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateFilter implements Filter {
private SessionFactory sessionFactory;
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
try {
sessionFactory.getCurrentSession().beginTransaction();
chain.doFilter(request, response);
sessionFactory.getCurrentSession().getTransaction().commit();
} catch (Exception ex) {
sessionFactory.getCurrentSession().getTransaction().rollback();
ex.printStackTrace();
}
}
public void init(FilterConfig filterConfig) throws ServletException {
sessionFactory = new Configuration().configure().buildSessionFactory();
}
public void destroy() {
}
}
我的应用程序中有两个 servlet 和两个相应的 jsp 文件 - 第一个显示 ID = 1 的问题,第二个显示所有问题。这是这个servlet的代码,相应的jsp文件和tomcat的配置:
GetOneQuestion.java
package app;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;
public class GetOneQuestion extends HttpServlet {
@Override
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
try {
Session session = new Configuration().configure()
.buildSessionFactory().getCurrentSession();
session.beginTransaction();
Question question = (Question)session.load(Question.class, 1L);
//session.getTransaction().commit();
request.setAttribute("oneQuestion", question);
} catch (Exception ex) {
ex.printStackTrace();
request.setAttribute("oneQuestion", null);
}
RequestDispatcher view = request.getRequestDispatcher("/oneQuestion.jsp");
view.forward(request, response);
}
}
oneQuestion.jsp
<%@page import="app.Answer"%>
<%@page import="app.Question"%>
<html>
<body>
<%
Question question = (Question)request.getAttribute("oneQuestion");
out.print("<br>" + question.getText() + "<br><br>");
%>
</body>
</html>
GetAllQuestion.java
package app;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.List;
import org.hibernate.*;
import org.hibernate.cfg.Configuration;
public class GetAllQuestion extends HttpServlet {
@Override
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
try {
Session session = new Configuration().configure()
.buildSessionFactory().getCurrentSession();
session.beginTransaction();
Query query = session.createQuery("from Question");
List all = query.list();
request.setAttribute("allQuestion", all);
} catch (Exception ex) {
ex.printStackTrace();
request.setAttribute("allQuestion", null);
}
RequestDispatcher view = request.getRequestDispatcher("/allQuestion.jsp");
view.forward(request, response);
}
}
allQuestion.jsp
<%@page import="app.Answer"%>
<%@page import="app.Question"%>
<%@page import="java.util.List"%>
<html>
<body>
<%
List all = (List)request.getAttribute("allQuestion");
for (Object object : all) {
Question question = (Question)object;
out.print("<br>Question " + question.getId());
for (Answer answer : question.getAnswers()) {
out.print("<br>" + answer.getText() + "<br>");
}
}
%>
</body>
</html>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<filter>
<filter-name>HibernateFilter</filter-name>
<filter-class>app.HibernateFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HibernateFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>getAllQuestion</servlet-name>
<servlet-class>app.GetAllQuestion</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getAllQuestion</servlet-name>
<url-pattern>/getAllQuestion</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>getOneQuestion</servlet-name>
<servlet-class>app.GetOneQuestion</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getOneQuestion</servlet-name>
<url-pattern>/getOneQuestion</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
问题
1) 为什么我需要在 servlet 中调用“session.beginTransaction()”方法,即使我已经在过滤器中调用了“session.beginTransaction()”方法?如果我从另一个 servler 调用一个 servler,我还必须在第二个 servlet 中调用此方法吗?或者我必须在每次与数据库交互之前调用此方法?
2)我不在过滤器中调用“sessionFactory.getCurrentSession().openSession()”或“sessionFactory.getCurrentSession().getCurrentSession()”,但我在中调用“sessionFactory.getCurrentSession().getCurrentSession()” servlet 并仍然获取似乎在过滤器中创建的 session 。怎么会这样?
3) 如果我取消注释行“session.getTransaction().commit();”在 jsp 文件中的 GetOneQuestion 类中,即使此 jsp 文件中没有延迟加载,我也会收到 LazyInitializationException:“无法初始化代理 - 无 session ”,因为我在那里不使用任何 Answer 对象。是什么原因导致这个异常呢?即使没有延迟加载, session 也必须打开才能与 Hibernate 对象进行任何交互?
最佳答案
您可以将 session 工厂存储在应用程序初始值设定项类的静态字段中,并在 servlet 中从中获取当前 session 。
关于您的问题
getCurrentSession()
返回一个通过ThreadLocal
绑定(bind)到当前线程的 session (并非总是如此,这取决于配置)。question.getAnswers()
中遇到 LazyInitializationException
。 关于java - openSession()、getCurrentSession()、beginTransaction()、延迟加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34809297/
过去几天我一直在 Hibernate 和 MySQL 上练习,我遇到了这个错误,表明我在 setUpSession.java 中的 sessionFactory 变量上有一个 NullPointerE
我已经配置了 NHibernate,并使用 Fluent NNibernate 连接到 PostgreSQL 数据库。 我有一个工作类,它采用 ISessionFactory 作为构造函数参数并使用队
我正在尝试使用 generic-dao ( http://code.google.com/p/hibernate-generic-dao/ )。但是,在我的 HibernateBaseDAO 中,ge
是否 hibernate SessionFactory.openSession()等待池中的数据库连接可用? 我认为它确实如此,但我有这个异常(exception)的客户 org.hibernate.
我有一个简单的 Java Web 应用程序,它从数据库接收一些信息并在 Web 浏览器中显示该信息。 Hibernate 用于与 servlet 和 jsp 文件中的数据库进行交互。一切都如我所愿,但
这个问题在这里已经有了答案: Hibernate openSession() vs getCurrentSession() (5 个答案) 关闭 6 年前。 OpenSession() 总是打开一个
您好,我已经使用 hibernate 配置了带有事务管理器的 sessionFactory 和 MysqL 数据源。当我尝试在 openSession() 之后立即对该工厂调用 getCurrentS
这是我的代码: hibernate .cfg.xml com.mysql.jdbc.Driver jdbc:mysql://localhost:3306
我是 N hibernate 的新手。我在我的应用程序中使用 n hibernate 。我编写的代码运行成功但有点慢,因为当我检查 hibernate 分析器时,它向我展示了进程缓慢的一些原因。“每个
我正在使用 Spring Hibernate 开发 Web 应用程序。在那里,我在 DAO 类中有一个方法。 当我通过 jsp 文件调用它时,它运行良好。但是当我通过 servlet 调用它时,它给出
我正在尝试对 Mozilla 进行 Web 扩展,它将使用 pkcs11 来签名、加密或验证文档、邮件。 我正在使用此 api 与我的开斋节卡片进行通信并从中获取插槽。 https://develop
我有一个问题,当我在服务器上运行时,我的 sessionFactory.openSession() 返回 null。在本地机器上一切都很好,但我不知道服务器上的问题是什么。 (我什至在关闭 iptab
我的类路径中有 hibernate3.jar 和 hibernate-core-4.2.0.CR1.jar,并且我使用的是 Spring 3.1.3 版本。代码编译成功,但在运行时出现以下错误 201
这个问题与另一个question有关我已经问过了,但是您为什么要使用 openSession() 而不是 getCurrentSession() 的原因是什么?我知道您会使用 openSession(
我正在使用 SessionFactory.openSession(Connection) 获取现有的 JDBC 连接。现在在 4.0 中此方法不可用。我应该使用哪种方法? 最佳答案 您可以使用 Ses
我想知道上面提到的 hibernates sessionfactory 类的两种方法之间的概念差异,如果可以通过简单的例子。 最佳答案 前者打开一个正常(有状态) session ,而后者(可能不足为
如果我在结束时用 Session.getCurrentTransaction().commit() 关闭 session 或用 session.close() 关闭 session 会发生什么方法?
我正在尝试将 Spring 3.1 与 Hibernate 4.1.4 集成,但从通用 DAO 获取 session 时遇到问题。 问题是,如果我使用 getCurrentSession() ,我会得
当我配置 hibernate 以连接到数据库并且由于某种原因连接失败时,我注意到它在构建工厂(这是可以接受的)和我调用 sessionFactory.openSession()(这是不太能接受)。更烦
我编写了一个示例 Spring Hibernate 应用程序以了解 Spring Hibernate 集成的工作原理。 这是我的 applicationContext.xml
我是一名优秀的程序员,十分优秀!