Java @事务性不使用spring和hibernate(如果没有活动事务,get无效)

Java @事务性不使用spring和hibernate(如果没有活动事务,get无效),java,spring,hibernate,transactional,Java,Spring,Hibernate,Transactional,我已经创建了一个SpringMVC应用程序。配置如下所示: dispatcher servlet.xml <beans > <mvc:annotation-driven /> <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/> <context:component-scan base-package=

我已经创建了一个SpringMVC应用程序。配置如下所示:

dispatcher servlet.xml

<beans >
   <mvc:annotation-driven />
   <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>

   <context:component-scan base-package="my.server.controller" />

</beans>
my.server.service.TreeServiceImpl

<beans >
     <context:annotation-config />
     <tx:annotation-driven transaction-manager="transactionManager"/>
     <context:component-scan base-package="my.server.dao" />
     <context:component-scan base-package="my.server.service" />


    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
      <property name="driverClassName" value="org.postgresql.Driver" />
      <property name="url" value="jdbc:postgresql://localhost:5432/jahanserver" />
      <property name="username" value="postgres" />
      <property name="password" value="postgres" />
    </bean>

   <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
      <property name="dataSource" ref="dataSource" />
      <property name="annotatedClasses">
        <list>
            <value>my.server.entity.TreeItem</value>
            <value>my.server.entity.TreeItemDetail</value>
            <value>my.server.entity.LayerItem</value>
        </list>
      </property>
      <property name="hibernateProperties">
        <props>
           <prop key="hibernate.dialect">org.hibernate.spatial.dialect.postgis.PostgisDialect</prop>
            <prop key="hibernate.current_session_context_class">thread</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="hibernate.connection.characterEncoding">UTF-8</prop>
            <prop key="hibernate.connection.charSet">UTF-8</prop>
            <prop key="hibernate.default_schema">public</prop>
        </props>
      </property>
   </bean>
   <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
      <property name="sessionFactory" ref="sessionFactory"/>
   </bean>
</beans>
@Service
public class TreeServiceImpl implements TreeService {

   @Inject
   TreeDao treeDao;

   @Override
   @Transactional
   public TreeItem getTreeItem(Long id) {
       return treeDao.getTreeItem(id);
   }
}
@Service
@Singleton
public class TreeDaoImpl extends AbstractDaoImpl implements TreeDao{

    public TreeItem getTreeItem(Long id){
        return (TreeItem)sessionFactory.getCurrentSession().get(TreeItem.class, id);
    }

    ...
}
my.server.dao.TreeDaoImpl

<beans >
     <context:annotation-config />
     <tx:annotation-driven transaction-manager="transactionManager"/>
     <context:component-scan base-package="my.server.dao" />
     <context:component-scan base-package="my.server.service" />


    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
      <property name="driverClassName" value="org.postgresql.Driver" />
      <property name="url" value="jdbc:postgresql://localhost:5432/jahanserver" />
      <property name="username" value="postgres" />
      <property name="password" value="postgres" />
    </bean>

   <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
      <property name="dataSource" ref="dataSource" />
      <property name="annotatedClasses">
        <list>
            <value>my.server.entity.TreeItem</value>
            <value>my.server.entity.TreeItemDetail</value>
            <value>my.server.entity.LayerItem</value>
        </list>
      </property>
      <property name="hibernateProperties">
        <props>
           <prop key="hibernate.dialect">org.hibernate.spatial.dialect.postgis.PostgisDialect</prop>
            <prop key="hibernate.current_session_context_class">thread</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="hibernate.connection.characterEncoding">UTF-8</prop>
            <prop key="hibernate.connection.charSet">UTF-8</prop>
            <prop key="hibernate.default_schema">public</prop>
        </props>
      </property>
   </bean>
   <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
      <property name="sessionFactory" ref="sessionFactory"/>
   </bean>
</beans>
@Service
public class TreeServiceImpl implements TreeService {

   @Inject
   TreeDao treeDao;

   @Override
   @Transactional
   public TreeItem getTreeItem(Long id) {
       return treeDao.getTreeItem(id);
   }
}
@Service
@Singleton
public class TreeDaoImpl extends AbstractDaoImpl implements TreeDao{

    public TreeItem getTreeItem(Long id){
        return (TreeItem)sessionFactory.getCurrentSession().get(TreeItem.class, id);
    }

    ...
}
my.server.controller.TreePermissionController.java

@RestController
@RequestMapping("/treePermission")
public class TreePermissionController implements InitializingBean{

   @Inject 
   TreeService treeService;

   private final PermissionFactory permissionFactory = new DefaultPermissionFactory();

   @Override
   public void afterPropertiesSet() throws Exception {
      Assert.notNull(treeService, "HBUtil cannot be null");
   }

   @RequestMapping(method = RequestMethod.GET, value = "/addPermission")
   public TreeItem addPermission(HttpServletRequest request, 
        @RequestParam Long id ) throws IOException {
       TreeItem item = treeService.getTreeItem(id);

       PrincipalSid sid = new PrincipalSid("dariush");
       Permission permission = permissionFactory.buildFromMask(16);

       try {
           treeService.addPermission(item, sid, permission);
       } catch (DataAccessException existingPermission) {
           existingPermission.printStackTrace();

       }
       return item;
   }

}
在控制器中,我称之为:

TreeItem item = treeService.getTreeItem(id);
我面临着这个错误:

org.hibernate.HibernateException: get is not valid without active transaction
有人问了一些同样问题的问题。我采纳了所有的建议,但这对我来说仍然是个问题。
我怎样才能解决它?请帮忙

使用spring和spring管理的事务时,除非您使用的是JTA,否则永远不要使用hibernate.current\u session\u context\u类属性

实际上,Spring在默认情况下会设置自己的CurrentSessionContext实现(SpringSessionContext),但是如果您自己设置,则情况并非如此,这意味着它破坏了正确的事务集成

因此,请删除/注释下面的 applicationContext.xml中的hibernateProperties

<prop key="hibernate.show_sql">true</prop>
true

希望这能解决配置文件中的错误,显示代码而不是
,问题的第一个猜测原因是配置,然后是Java代码您将dao注释为
@Service
,应该是
@Repository
向我们显示控制器的代码。我是否对“hibernate.current\u session\u context\u class”或“hibernate.Show\u sql”进行注释?