2015-12-02 3 views
-1

Я пытаюсь разработать простое веб-приложение с использованием Spring и Hibernate JPA на сервере Glassfish 4.1.1.Spring with Hibernate JPA - ошибки времени выполнения

У меня есть класс сущностей:

package entity; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.Table; 

@Entity 
@Table(name = "USERS") 
public class User { 
    @Id 
    @GeneratedValue 
    @Column(name = "ID") 
    private long id; 
    private String firstName; 
    private String lastName; 
    private String email; 
    private String login; 
    private String password; 

    public User() { 
    } 

    public User(long id, String firstName, String lastName, String email, String login, String password) { 
     this.id = id; 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.email = email; 
     this.login = login; 
     this.password = password; 
    } 

    getters and setters... 
} 

Затем контроллер класса:

package controller; 

import ... 

@Controller 
public class LoginController { 
    @Autowired 
    private UserService userService; 

    @RequestMapping(value = "/login", method = RequestMethod.POST) 
    public ModelAndView executeLogin(HttpServletRequest request, HttpServletResponse response, @ModelAttribute("user") User user) { 
      userService.addUser(new User(20, "a", "b", "dgsd", "sfadf", "sdfsdf")); 
    } 
} 

UserService:

package service; 

import dao.UserDao; 
import entity.User; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Service; 

@Service 
public class UserService { 
    @Autowired 
    UserDao userDao; 

    public void addUser(User user) { 
     userDao.insert(user); 
    } 
} 

UserDao:

package dao; 

import entity.User; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import org.springframework.stereotype.Repository; 

@Repository("userDao") 
public class UserDao { 
    @PersistenceContext 
    private EntityManager entityManager; 


    public void insert(User user) { 
     entityManager.persist(user); 
    } 
} 

Это мой persistance.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence"> 
    <persistence-unit name="LibraryPU" transaction-type="JTA"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <jta-data-source>java:app/library</jta-data-source> 
    </persistence-unit> 
</persistence> 

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"> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/applicationContext.xml</param-value> 
    </context-param> 

    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <servlet> 
     <servlet-name>dispatcher</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>2</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>dispatcher</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 
</web-app> 

диспетчеру-servlet.xml

<?xml version='1.0' encoding='UTF-8' ?> 
<!-- was: <?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:p="http://www.springframework.org/schema/p" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:aop="http://www.springframework.org/schema/aop" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 

    <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/> 


    <bean id="viewResolver" 
      class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
      p:prefix="/WEB-INF/jsp/" 
      p:suffix=".jsp" /> 


    <context:component-scan base-package="service, controller, dao" /> 

</beans> 

Когда я пытаюсь развернуть приложение, я у меня много исключений. Первый:

Warning: Exception while dispatching an event 
java.lang.NullPointerException 
    at org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.getStatus(JtaStatusHelper.java:76) 
    at org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.isActive(JtaStatusHelper.java:118) 
    at org.hibernate.engine.transaction.internal.jta.CMTTransaction.join(CMTTransaction.java:149) 
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.joinTransaction(AbstractEntityManagerImpl.java:1602) 
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.postInit(AbstractEntityManagerImpl.java:210) 
    at org.hibernate.jpa.internal.EntityManagerImpl.<init>(EntityManagerImpl.java:91) 
    at org.hibernate.jpa.internal.EntityManagerFactoryImpl.internalCreateEntityManager(EntityManagerFactoryImpl.java:345) 
    at org.hibernate.jpa.internal.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:313) 
    at org.glassfish.persistence.jpa.JPADeployer$2.visitPUD(JPADeployer.java:451) 
    at org.glassfish.persistence.jpa.JPADeployer$PersistenceUnitDescriptorIterator.iteratePUDs(JPADeployer.java:510) 
    at org.glassfish.persistence.jpa.JPADeployer.iterateInitializedPUsAtApplicationPrepare(JPADeployer.java:492) 
    at org.glassfish.persistence.jpa.JPADeployer.event(JPADeployer.java:398) 
    at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:131) 
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:487) 
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:219) 
    at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:491) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:539) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:535) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:360) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$2.execute(CommandRunnerImpl.java:534) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$3.run(CommandRunnerImpl.java:565) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$3.run(CommandRunnerImpl.java:557) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:360) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:556) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1464) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1300(CommandRunnerImpl.java:109) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1846) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1722) 
    at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:534) 
    at com.sun.enterprise.v3.admin.AdminAdapter.onMissingResource(AdminAdapter.java:224) 
    at org.glassfish.grizzly.http.server.StaticHttpHandlerBase.service(StaticHttpHandlerBase.java:189) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167) 
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206) 
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180) 
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235) 
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:283) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111) 
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) 
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:536) 
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137) 
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591) 
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571) 
    at java.lang.Thread.run(Thread.java:745) 

Что я делаю неправильно? Спасибо за помощь!

+0

Можете ли вы показать конфигурацию Hibernate? – dunni

+0

Нужно ли мне это? Я нашел много примеров в Интернете, а файл .cfg.xml не требуется. – bartex9

+0

Вы, по крайней мере, должны указать, например. класс поиска менеджера транзакций для работы с Glassfish. См. Http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html_single/#jtamanagerlookup – dunni

ответ

0

Ваш код пытается создать JTA-дееспособный субъект-менеджер, потому что вы настроили единицы сохранения быть JTA-enabled:

<persistence-unit name="LibraryPU" transaction-type="JTA"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <jta-data-source>java:app/library</jta-data-source> 
</persistence-unit> 

Но JTA-способные EMs обычно не должны быть созданы WebApps.

Если вы действительно нацелены на простой webapp, вы, скорее всего, должны пойти на простое устройство постоянной работы. Если вы выполните приведенную выше ссылку (Глава: Действительное использование блока RESOURCE_LOCAL), вы увидите, в чем разница. Простая конфигурация может выглядеть так:

<persistence> 
    <persistence-unit name="manager1" transaction-type="RESOURCE_LOCAL"> 
     <class>org.hibernate.ejb.test.Cat</class> 
     <class>org.hibernate.ejb.test.Distributor</class> 
     <class>org.hibernate.ejb.test.Item</class> 
     <properties> 
      <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver"/> 
      <property name="javax.persistence.jdbc.user" value="sa"/> 
      <property name="javax.persistence.jdbc.password" value=""/> 
      <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:."/> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/ 
      <property name="hibernate.max_fetch_depth" value="3"/> 

      <!-- cache configuration --> 
      <property name="hibernate.ejb.classcache.org.hibernate.ejb.test.Item" value="read-write"/> 
      <property name="hibernate.ejb.collectioncache.org.hibernate.ejb.test.Item.distributors" value="read-write, RegionName"/> 

      <!-- alternatively to <class> and <property> declarations, you can use a regular hibernate.cfg.xml file --> 
      <!-- property name="hibernate.ejb.cfgfile" value="/org/hibernate/ejb/test/hibernate.cfg.xml"/ --> 
     </properties> 
    </persistence-unit> 
    </persistence> 
Смежные вопросы