Spring data + Hibernate
Ich bin mit Spring Data und Hibernate und erhalten Sie eine Fehlermeldung, wenn ich versuche zu speichern Entität mit Satz-id:
org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist: com.snp.cm.persistency.contact.Contact; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: com.snp.cm.persistency.contact.Contact
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:668)
Bitte helfen Sie mir, wie kann ich Sie aktualisieren eine Entität mit JpaRepositories oder welche config muss ich tun, miss?
persistence.xml:
<?xml version="1.0" encoding="UTF-8"?> <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"
version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="contactManagerPU">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>com.snp.cm.persistency.contact.Contact</class>
<class>com.snp.cm.persistency.contact.TelephoneNumber</class>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="hibernate.max_fetch_depth" value="3" />
</properties>
</persistence-unit>
spring-context:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><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:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd"
default-lazy-init="true">
<import resource="classpath*:META-INF/spring/dbs-repository-context.xml" />
<!-- Activates JPA's @PersistenceContext and @PersistenceUnit (if available)
annotations to be detected in bean classes. -->
<context:annotation-config />
<!-- Enable Transaction using @Transactional annotation -->
<tx:annotation-driven />
<bean id="daTM"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource" />
<!-- Create local transaction manager -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
p:entityManagerFactory-ref="entityManagerFactory" lazy-init="true"
p:dataSource-ref="dataSource" />
<!-- Create EntityManagerFactory for injection into services. -->
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
p:dataSource-ref="dataSource" p:persistenceXmlLocation-ref="persistenceXmlLocation">
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="true" />
</bean>
</property>
</bean>
<!-- Database access configuration -->
<bean id="persistenceXmlLocation" class="java.lang.String">
<constructor-arg value="classpath*:META-INF/persistence.xml"></constructor-arg>
</bean>
<context:property-placeholder
location="classpath:META-INF/spring/jdbc.properties" />
<!-- Dev's env DataSource -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
Ich verwendet, OpenJpa in einem anderen Projekt und habe nicht solche Probleme: 'speichern' methode hat erstellen und aktualisieren, wenn ein Unternehmen Satz-id. Also, wie kann ich ein update für ein Objekt? Soll ich setze meine eigene update-methode?
Test fehlgeschlagen:
@Test
public void testRepositorySaveMethod() {
Contact contact = new Contact();
contact.setLastName("Carter");
contact.setName("John");
contact.setNickName(null);
contact = this.contactRepository.save(contact);
Assert.assertNotNull(contact.getContactId());
TelephoneNumber telephoneNumber1 = new TelephoneNumber();
telephoneNumber1.setTelephoneNumber("777 7777777");
telephoneNumber1.setContact(contact);
telephoneNumber1.setTelephoneType(TelephoneType.HOME);
this.telephoneNumberRepository.save(telephoneNumber1); //failes cause contact has already id
contact = this.contactRepository.findOne(contact.getContactId());
Assert.assertEquals(1, contact.getTelephoneNumbers().size());
}
- Sie benötigen zum anzeigen von code. Sie haben nur die Konfigurationen für Ihre ORM und Bohnen hier. Die Ursache ist sicher Ihren code.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Grund ist der folgende. Die
save(…)
Methode des repository-proxy ist ein transaktional. Sie haben einJpaTransactionManager
konfiguriert den Lebenszyklus der HibernateSession
gebunden ist, um die Transaktion. Dies führt in derSession
(und Transaktion) geschlossen wird, wenn der Aufruf wieder vonsave(…)
im test Fall. Also die Person ist nicht an dasSession
mehr, welche bewirkt, dass die Ausnahme, die Sie später sehen.Die Lösung in den test-Fällen in der Regel wird zur Markierung der test-Methode wie
@Transactional
. Angenommen, Sie sind mit dem Spring-test-context-framework, wird es zu einer Transaktion (und damit eineSession
) geöffnet (und offen gehalten) für den gesamten test-Methode.Abgesehen davon, dass die Erklärung der
DataSourceTransactionManager
ist obsolet, da Sie nicht scheinen, um es überall benutzen.@Transactional
wie Oliver vorgeschlagen?Ist alles gesagt:
detached entity passed to persist
Vermutlich werden Sie versuchen, etwas zu tun, wie unten:
Scheint es
id
für Ihre Person alle versuchen werden aktualisiert mitpersist
.Können Sie einen Blick auf diese Antwort zu: "detached entity passed to persist Fehler" mit JPA/EJB-code