2013-06-15 1 views
2

У меня проблема с данными flush в базу данных PostgreSQL в SpringMVC. Когда я использую entityManager.flush().Jndi, hibernate и entitymanager persist и метод flush нет записи в базе данных

Таблица создается в PosgreSQL, я могу использовать pgadmin3 и существует, но проблема в том, что после того, как я прошел элемент от контроллера к ImageDaoImpl он не толкал запись в базу данных;/

@Repository 

@Transactional(propagation = Propagation.REQUIRED) 
public class ImageDaoImpl implements ImageDao { 

    @PersistenceContext 
    private EntityManager em; 

    @Transactional 
    public void register(Image image) { 
     em.persist(image); 
     em.flush(); 
     return; 
    } 

} 

Это бросило мне ошибку, пока я хотел сделать метод регистрации. javax.persistence.TransactionRequiredException: no transaction is in progress

Я попытался сделать:

@Transactional 
public void register(Image image) { 
    em.getTransaction().begin(); 
    em.persist(image); 
    em.getTransaction().commit(); 
    return; 
} 

но бросил меня:

threw exception: java.lang.IllegalStateException: Not allowed to create transaction on shared EntityManager - use Spring transactions or EJB CMT instead 

Сначала я подумал, что что-то не так, и добавить fristly @PersistenceContext.

Я нашел EntityManager cannot use persist to save element to database

и попытался добавить

<tx:annotation-driven transaction-manager="transactionManager"/> 

и

<bean id="transactionManager" 
     class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory"/> 
    </bean> 

Но я тогда я думал, как это не представляется возможным присоединить менеджер: Затем я получил ошибку например:

java.lang.ClassNotFoundException: org.springframework.jdbc.datasource.JdbcTransactionObjectSupport 

Что делать дальше? Как я могу интегрировать <jee:jndi-lookup jndi-name="java:jboss/spring-quickstart/persistence" id="entityManagerFactory" ... с транзакционным менеджером? В чем разница между ними? Какой из них я должен использовать для подключения к базе данных?

Возможно, есть еще одна проблема, которую я не мог видеть.

У меня есть все соединение с базой данных, но проблема с флешем сделала меня сумасшедшим. Я не пытался читать информацию из Entity в браузере, прежде чем я хочу пересылать информацию в базу данных.

Я прочитал Spring jta-transaction-manager

и попытался прокомментировать эту линию

но бросил меня: (MSC сервис нить 1-2) инициализации контекста не удалось: java.lang.NoClassDefFoundError: org/springframework/orm/jpa/JpaTransactionManager $ JpaTransactionObject

Почему не удалось найти подходящее решение: EntityManager persist() method does not insert record to database Где я должен зарегистрировать класс Image, чтобы совершить транзакцию?

Вот фрагмент Контроллера.

@RequestMapping(value = "/save", method = RequestMethod.POST) 
     public String save(
       @ModelAttribute("uploadForm") ImageDaoImpl uploadForm, 
         Model map, BindingResult result) throws IllegalStateException, IOException { 
          ... 
          String filePath = fileCatalog + orgName;           
         Image memberImage = new Image(); 
         memberImage.setFilePath(filePath);    
         imageDao.register(memberImage); 

           ... 
       } 
      } 

Я создаю объект и задаю одно значение, которое мне нужно в базе данных. Файл, который я получаю, сохраняется на жестком диске.Мне нужно это позже для моей другой программы. Это хороший способ зарегистрировать объект в приложении. Может быть, это причина, что она не прилипает к базе данных?

В конце я прилагаю мои файлы конфигураций:

ImageDomain:

@Entity 
@Table(name="IMAGES") 
public class Image { 

    @Id 
    @Column(name="ID") 
    @GeneratedValue 
    private Integer id; 

    @Column(name="NAME") 
    private String name; 

    @Column(name="CONTENTTYPE") 
    private String contentType; 

    @Column(name="LENGTH") 
    private Integer length; 

    @Column(name="ISPOCESSED") 
    private boolean isprocessed; 

    @Column(name="CONTENT") 
    @Lob 
    private Blob content; 

    @Column(name="FILEPATH") 
    private String filepath; 

    public Integer getId() { 
     return id; 
    } 
    public void setId(Integer id) { 
     this.id = id; 
    } 
    public String getName() { 
     return name; 
    } 

    public void setFilePath(String filepath) { 
     this.filepath = filepath; 
    } 

    public String getFilePath(){ 
     return filepath; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public String getContentType() { 
     return contentType; 
    } 
    public void setContentType(String contentType) { 
     this.contentType = contentType; 
    } 
    public Blob getContent() { 
     return content; 
    } 
    public void setContent(Blob content) { 
     this.content = content; 
    } 
    public Integer getLength() { 
     return length; 
    } 
    public void setLength(Integer length) { 
     this.length = length; 
    } 

} 

META-INF/весна/applicationContext.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:aop="http://www.springframework.org/schema/aop" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:jee="http://www.springframework.org/schema/jee" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
     http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> 

    <context:component-scan base-package="org.springmvc.trophy.domain"/> 

    <context:component-scan base-package="org.springmvc.trophy.repo"/> 

    <tx:annotation-driven /> 

</beans> 

META-INF/весна/инфраструктура .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:jee="http://www.springframework.org/schema/jee" 
      xmlns:tx="http://www.springframework.org/schema/tx" 
      xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
       http://www.springframework.org/schema/tx 
       http://www.springframework.org/schema/tx/spring-tx.xsd 
       http://www.springframework.org/schema/jee 
       http://www.springframework.org/schema/jee/spring-jee.xsd"> 

    <!-- JDNI name for EntityManagerFactory is defined in src/main/resources/META-INF/persistence.xml --> 


    <jee:jndi-lookup jndi-name="java:jboss/spring-quickstart/persistence" id="entityManagerFactory" 
        expected-type="javax.persistence.EntityManagerFactory" /> 

    <bean id="entityManager" class="org.springframework.orm.jpa.support.SharedEntityManagerBean"> 
     <property name="entityManagerFactory" ref="entityManagerFactory"/> 
    </bean> 

    <tx:jta-transaction-manager /> 

</beans> 

META-INF/Persistance.xml

<persistence version="2.0" 
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=" 
     http://java.sun.com/xml/ns/persistence 
     http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="primary" transaction-type="RESOURCE_LOCAL"> 
     <!-- If you are running in a production environment, add a managed data 
      source, this example data source is just for development and testing! --> 
     <!-- The datasource is deployed as WEB-INF/spring-quickstart-ds.xml, you 
      can find it in the source at src/main/webapp/WEB-INF/spring-quickstart-ds.xml --> 
     <jta-data-source>java:jboss/datasources/ImagesDS</jta-data-source> 

     <properties> 
      <property name="jboss.entity.manager.factory.jndi.name" 
       value="java:jboss/spring-quickstart/persistence" />    
      <property name="hibernate.hbm2ddl.auto" value="update" /> 
      <property name="hibernate.show_sql" value="false" /> 
      <property name="hibernate.format_sql" value="true" /> 


     </properties> 
</persistence-unit> 

</persistence> 

WebAPP/WEB-INF/изображения-ds.xml

<?xml version="1.0" encoding="UTF-8"?> 
<datasources xmlns="http://www.jboss.org/ironjacamar/schema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.jboss.org/ironjacamar/schema http://docs.jboss.org/ironjacamar/schema/datasources_1_0.xsd"> 
    <!-- The datasource is bound into JNDI at this location. We reference this 
     in META-INF/persistence.xml --> 
    <datasource jndi-name="java:jboss/datasources/ImagesDS" 
     pool-name="kitchensink-quickstart" enabled="true" jta="false" use-java-context="true" use-ccm="false"> 
     <connection-url>jdbc:postgresql://localhost:5432/dermadb</connection-url> 
     <driver-class>org.postgresql.Driver</driver-class> 
     <driver>postgresql-9.1-901.jdbc4.jar</driver> 
     <security> 
      <user-name>username</user-name> 
      <password>dbpassword</password> 
     </security> 
    </datasource> 
</datasources> 

Я развернут модуль для PostgreSQL: в WebAPP/WEB-INF/JBoss развертывания -структура.xml

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> 
    <deployment> 
     <dependencies> 
      <module name="org.postgresql"/> 
      <!-- <module name="com.h2database.h2"/> --> 
      <module name="org.codehaus.jackson.jackson-core-asl"/> 
      <module name="org.codehaus.jackson.jackson-mapper-asl"/> 
      <module name="org.slf4j"/> 
     </dependencies> 
    </deployment> 
</jboss-deployment-structure> 

Заранее благодарим за ответ.

ответ

0

Я, наконец, решил проблему.

Во-первых, я думал, что с менеджером транзакций что-то не так, и я добавляю aspectj к проекту.

META-INF/весна/infrastructure.xml

<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" /> 

добавить также библиотеку Maven - файл: pom.xml

<dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-aspects</artifactId> 
     <version>2.5</version> 
    </dependency> 

В конце концов я понял, что мне не нужно использовать транзакцию фиксации и закрытия и т. д. Как вы можете видеть в моем первом сообщении. Фабрика Entity и диспетчер передаются мысли @PersistenceContext, и я могу использовать entityManager.persist(object), чтобы передать объект в базу данных, и транзакция закончится.

Моя ошибка была в процессе настройки подключения к базе данных в persistence.xml я использовал ресурс локального в этой строке:

<persistence-unit name="primary" transaction-type="RESOURCE_LOCAL"> 

и в следующем шаге я использовал JTA, чтобы соединиться с базой данных. Вот и вся проблема.

я изменить эту строку в

<persistence-unit name="primary" transaction-type="JTA"> 

и это произошло, что все нормально и объект сбрасывается в базу данных.

Спасибо, Павел Хорал за вашу помощь, и я надеюсь, что этот ответ поможет кому-то еще. Вам всегда нужно следить за деталями.

0

Похоже, проблема в классе. Вы пытаетесь разделить библиотеки Spring? Если нет, убедитесь, что у вас есть spring-orm в ваших зависимостях.

+0

Я проверил классные пути.У меня есть весна-орм-3.1.1.RELEASE в моих зависимостях от maven. Что вы имеете в виду в библиотеках Spring Spring? Недостаточно включить его в maven? – tomex443

+0

«Поделиться библиотеками весны» - если вы пытаетесь поместить их в общий загрузчик классов ... но вы, вероятно, этого не делаете. Если вы используете Maven, проверьте список зависимостей, чтобы проверить конфликты в JAR-версии. –

+0

Привет. Мне жаль, что я опоздал списать ответ. Если у меня конфликты в Maven, сервер не запустится. Eclipse проверяет JAR в Maven. Я проверил [link] (http://stackoverflow.com/questions/4155991/spring-annotation-driven-transaction-manager) Они пишут что-то об аспекте, и я думаю, что может быть проблема, что я ничего не реализую. – tomex443