У меня проблема с данными 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>
Заранее благодарим за ответ.
Я проверил классные пути.У меня есть весна-орм-3.1.1.RELEASE в моих зависимостях от maven. Что вы имеете в виду в библиотеках Spring Spring? Недостаточно включить его в maven? – tomex443
«Поделиться библиотеками весны» - если вы пытаетесь поместить их в общий загрузчик классов ... но вы, вероятно, этого не делаете. Если вы используете Maven, проверьте список зависимостей, чтобы проверить конфликты в JAR-версии. –
Привет. Мне жаль, что я опоздал списать ответ. Если у меня конфликты в Maven, сервер не запустится. Eclipse проверяет JAR в Maven. Я проверил [link] (http://stackoverflow.com/questions/4155991/spring-annotation-driven-transaction-manager) Они пишут что-то об аспекте, и я думаю, что может быть проблема, что я ничего не реализую. – tomex443