Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 使用实体管理器关闭休眠会话_Hibernate_Spring_Jpa - Fatal编程技术网

Hibernate 使用实体管理器关闭休眠会话

Hibernate 使用实体管理器关闭休眠会话,hibernate,spring,jpa,Hibernate,Spring,Jpa,我正在开发一个软件的一部分,它有两个模块(邮件和web服务)。但是我的代码中有一些混乱,我认为我做得不对/不好/困难。有人能帮我克服这些吗?问题是hibernate正在关闭会话 这是我的pom结构 -- root -- mail -- web-service 需要注意的是,我的spring引导、appContext.xml和持久性上下文都是在我的web服务模块中管理的,我在web服务模块中使用邮件模块作为依赖项jar 我的appContext.xml是这样的 <cont

我正在开发一个软件的一部分,它有两个模块(邮件和web服务)。但是我的代码中有一些混乱,我认为我做得不对/不好/困难。有人能帮我克服这些吗?问题是hibernate正在关闭会话

这是我的pom结构

 -- root
    -- mail
    -- web-service
需要注意的是,我的spring引导、appContext.xml和持久性上下文都是在我的web服务模块中管理的,我在web服务模块中使用邮件模块作为依赖项jar

我的appContext.xml是这样的

<context:component-scan base-package="com.it.ese.orbitws,com.it.ese.orbitmail" />

<context:annotation-config />
<tx:annotation-driven />


<!-- enables interpretation of the @PersistenceUnit/@PersistenceContext annotations providing convenient
 access to EntityManagerFactory/EntityManager -->
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>


 <bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
    <property name="url" value="jdbc:sqlserver://localhost:1433;database=ORBIT_RC" />
    <property name="username" value="sa" />
    <property name="password" value="sa" />
</bean>

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="databasePlatform" value="org.hibernate.dialect.SQLServerDialect" />
            <property name="showSql" value="true" />
        </bean>
    </property>
    <property name="dataSource" ref="dataSource" />
</bean>


 <bean id="transactionManager"
    class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory"
              ref="entityManagerFactory" />
        <qualifier value="tx"/>
  </bean>
因此,我制作了自己的
JavaMailSenderImpl
,在这里我像这样重写了getHost方法。我的困惑在于代码中的注释

package com.it.ese.mail
@Component 
public class OrbitJavaMailSenderImpl extends JavaMailSenderImpl{


 private EntityManager entityManager;
 private String smtp=null;

 private OrbitJavaMailSenderImpl() {
 }

 // I have used  PersistenceContextType.EXTENDED because without this,it says
 // Hibernate Session is closed.But using EXTENDED is a bad thing?or it's ok?  

 @PersistenceContext (type= PersistenceContextType.EXTENDED)
 public void setEntityManager(EntityManager entityManager) {
     this.entityManager = entityManager;
 }

 //There is no Bean for CUStom TABLE so far in persistence.xml.Should I do that too?

 @Transactional(readOnly=true)
 public String getSMTPAddress() {
    String host="mail.esolutionss-europe.com";
    try{
        host= this.entityManager.createNativeQuery("SELECT smtp FROM CUSTOM")
                .getSingleResult().toString();
    }catch(Exception e){
        System.out.println("error getting host:"+e.toString());

    }

    return host;
}
}

在web服务模块中,我有一个服务
NotificationService
,我正在注入spring mail服务

package com.it.ese.ws.service 
public class NotificationService implements INotificationService {

private EntityManager entityManager;
private String sender=null;

final static Logger logger = Logger.getLogger(NotificationService.class);

@PersistenceContext (type= PersistenceContextType.EXTENDED)
public void setEntityManager(EntityManager entityManager) {
    this.entityManager = entityManager;
}


//Also here if I don't use EXTENTED persistence context,it gives me error as hibernate session is closed.

@Transactional(readOnly=true)
public String getGlobalSender() {
    String sender="a1@xxx.com";
    try{
        sender= entityManager.createNativeQuery("SELECT Global_email FROM CUSTOM")
                .getSingleResult().toString();
    }catch(Exception e){

    }
    return sender;
} /*other methods*/ }

为什么我的EntityManager要关闭?这个容器是管理的吗?是什么导致关闭sesesion?

不要使用
PersistenceContextType.EXTENDED
(除非您非常清楚自己在做什么)。详细解释。

我找到了解决方案。我犯了一个错误。我所做的是我有一个方法

public String getX(){
   return getY()
}
从getX我调用getY,它有@Transactional,我实际上使用的是实体管理器。 问题是我没有使用@Transactional,所以它说会话已关闭。 现在我确实喜欢

@Transactional 
public String getX(){  //getX() is just a wrapper for some reason :)
  return getY(); 
} 

现在一切顺利。但这是正当的原因还是其他原因?

我今天下午看了你的博客,这就是为什么在这里发布我的代码。如果不使用,我的hibernate会话将关闭。在这种情况下可以做什么?抱歉,测试类最后sendXX方法不在代码中,它只是发送电子邮件。但是它使用getGlobalSender()方法从数据库获取电子邮件发件人通常检测会话和事务管理问题需要分析大量代码。恐怕你得自己做。遵循我列出的指导原则应该会更容易。是的,这是一个典型的案例。我猜你找到了
@Transactional 
public String getX(){  //getX() is just a wrapper for some reason :)
  return getY(); 
}