我是Hibernate的新手,不知道是否要使用SessionFactory或EntityManagerFactory获取hibernate会话.两者有什么区别?优点缺点?
我得到以下错误
org.hibernate.HibernateException: No Session found for current thread
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97)
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1024)
at com.fexco.shoptaxfreemobile.service.ProfileService.registerVisitor(ProfileService.java:57)
at com.fexco.shoptaxfreemobile.controller.ProfileController.registerVisitor(ProfileController.java:91)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:770)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at com.fexco.shoptaxfreemobile.jsonp.JsonpCallbackFilter.doFilter(JsonpCallbackFilter.java:33)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at …Run Code Online (Sandbox Code Playgroud) 我已为我的实体配置了复合主键,Employee如下所示
Employee.java:
@Entity
@Table(name="employee")
@Proxy(lazy=false)
@IdClass(EmployeeId.class)
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
private EmployeeId employeeId;
private Person person;
private Branch branch;
private boolean isActive;
public Employee() {
}
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name="person", column = @Column(name="person_id")),
@AttributeOverride(name="branch", column = @Column(name="branch_id"))})
public EmployeeId getEmployeeId() {
return employeeId;
}
public void setEmployeeId(EmployeeId employeeId) {
this.employeeId = employeeId;
}
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="person_id")
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person; …Run Code Online (Sandbox Code Playgroud) 我正在创建SessionFactory,我将我的数据源作为对象在我正在创建SessionFactory的代码中,但是我无法将数据源设置为Hibernate Configuration对象.那么如何将我的数据源设置为SessionFactory?
Configuration configuration = new Configuration();
Properties properties = new Properties();
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLInnoDBDialect");
configuration.setProperties(properties);
configuration.setProperty("packagesToScan", "com.my.app");
SessionFactory sessionFactory = configuration.configure().buildSessionFactory();
Run Code Online (Sandbox Code Playgroud) 我编写了一个NHibernateSessionFactory类,它包含一个静态的Nhibernate ISessionFactory.这用于确保我们只有一个会话工厂,并且第一次调用OpenSession()我创建了一个实际的SessionFactory - 下次我使用相同的并打开一个会话.代码如下所示:
public class NhibernateSessionFactory : INhibernateSessionFactory
{
private static ISessionFactory _sessionFactory;
public ISession OpenSession()
{
if (_sessionFactory == null)
{
var cfg = Fluently.Configure().
Database(SQLiteConfiguration.Standard.ShowSql().UsingFile("Foo.db")).
Mappings(m => m.FluentMappings.AddFromAssemblyOf<MappingsPersistenceModel>());
_sessionFactory = cfg.BuildSessionFactory();
BuildSchema(cfg);
}
return _sessionFactory.OpenSession();
}
private static void BuildSchema(FluentConfiguration configuration)
{
var sessionSource = new SessionSource(configuration);
var session = sessionSource.CreateSession();
sessionSource.BuildSchema(session);
}
}
Run Code Online (Sandbox Code Playgroud)
现在我有一个问题.我的应用程序分为客户端和服务器.Nhibernate的东西在服务器端.在启动时,我的客户端和服务器都希望通过一些将使用NhibernateSessionFactory的服务来访问数据库.结果是在请求来自客户端之前是否创建了_sessionFactory的竞争条件.如果不是它会失败..
我想我需要在NhibernateSessionFactory中使用某种排队或等待机制,但我不知道该怎么做.以前有人遇到过同样的问题吗?什么是最好的解决方案?
我有一个Hibernate的DAO,在根据Hibernate的API 3和春天3.x中,我用一个简单的sessionFactory和NOT的HibernateDaoSupport+ getHibernateTemplate()-我希望这是一个不错的选择-
现在我的目标是sessionFactory使用注释自动装入我的DAO.
我spring.xml有这个:
<context:component-scan base-package="data" />
Run Code Online (Sandbox Code Playgroud)
内部数据包我有我所有的DAO和服务类.
这很简单HibernateDao:
@Repository
public class PersonHDAO implements PersonDAO {
private SessionFactory sessionFactory;
@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public List<Person> findAll(){
return sessionFactory.getCurrentSession().createQuery("bla bla").list();
}
}
Run Code Online (Sandbox Code Playgroud)
我在spring.xml加载过程中没有错误,但sessionFactory仍然是null.
我该怎么办?
编辑
这是我sessionFactory在spring.xml以下方面的声明:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context" …Run Code Online (Sandbox Code Playgroud) 我想知道是否有办法从会话工厂获取默认模式名称,不知何故?我需要得到它的原因是因为我必须使用一个本机SQL,并且我有多个会话工厂用于多个模式和单个数据源.所有生成的hibernate查询都由一个用户运行,该用户可以选择访问其他模式.
我使用spring和hibernate配置mysql db.
我的we.xml文件包含以下代码:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/classes/applicationcontext.xml</param-value>
</context-param>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
Run Code Online (Sandbox Code Playgroud)
我的applicationcontext.xml文件有以下导入:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-autowire="autodetect">
<import resource="spring-config/spring-common-applicationContext.xml"/>
<import resource="spring-config/spring-db-applicationContext.xml"/>
<import resource="spring-config/spring-dao-applicationContext.xml"/>
<import resource="spring-config/spring-processor-applicationContext.xml"/>
<import resource="spring-config/spring-security-processor-applicationContext.xml"/>
<import resource="spring-config/spring-service-applicationContext.xml"/>
<import resource="spring-config/spring-security-service-applicationContext.xml"/>
</beans>
Run Code Online (Sandbox Code Playgroud)
我的spring-db-applicationContext.xml有以下代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-autowire="autodetect">
<!-- Hibernate session factory -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<constructor-arg index="0">
<value>${driverClassName}</value>
</constructor-arg>
<constructor-arg …Run Code Online (Sandbox Code Playgroud) 我在Tomcat上使用Hibernate和Spring.我一直在阅读并重新阅读关于该主题的指向JBoss wiki页面的内容,这很有帮助.但它给我留下了一些问题.
为每个请求启动交易的想法让我很烦恼.我想我可以将过滤器限制在某些控制器 - 可能将我需要交易的所有控制器放在伪"tx"路径下.但如果您不知道是否需要交易,那么使用交易不是一个坏主意吗?如果我只是在某些请求中读取 - 很可能来自缓存的读取 - 在没有事务的情况下我不是更好吗?
我读过帖子,提到他们如何处理服务层的事务,我想用Spring做这件事.但那么过滤器代码是什么样的呢?我仍然希望在我的视图中可以使用会话进行一些延迟加载.
如果我所要做的就是调用sessionFactory.getCurrentSession()我的过滤器,它如何被"释放"回会话工厂重新使用?(session.close()即使在使用事务时,我也希望看到一个或者什么.)谁在告诉会话工厂该会话可以重用?
也许beginTransaction()是在请求期间将给定数据库连接绑定到给定会话的调用?否则,会话根据需要从池中提取数据库连接,对吧?
感谢您对我的所有问题的耐心等待.
(如果你的答案将成为Spring文档的链接,那么你只会让我哭泣.你不想要那个,是吗?如果人们不再回答Spring相关的问题,我会付真钱吗办法.)
这是我的DAO:
public List<Weather> getCurrentWeather() {
return sessionFactory.getCurrentSession().createQuery("from Weather").list();
}
Run Code Online (Sandbox Code Playgroud)
这可以从表天气中获取所有元素.但是,让我说我想做这样的事情(我只希望表天气中的一个元素):
public Weather getCurrentWeather() {
return sessionFactory.getCurrentSession().createQuery("from Weather where id = 1").list(); // here should be something else than list()
}
Run Code Online (Sandbox Code Playgroud)
我知道最终不应该有 list() ,但我必须在那里写什么才能得到一个对象?
sessionfactory ×10
hibernate ×8
spring ×5
java ×4
autowired ×1
c# ×1
jpa ×1
nhibernate ×1
spring-4 ×1
spring-orm ×1