2013-03-28 17 views
5

Używam implementacji JPA w wersji Hibernate 4.1.4.Final. Mój problem polega na tym, że nie mogę pracować EntityManager#remove(). Wszystkie pozostałe operacje: update, insert, select działają dobrze, z wyjątkiem tego.Używanie JPA z implementacją Hibernate: entityManager.remove - nie działa

Moja persistence.xml file:

<persistence-unit name="myEntityManager"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <class>core.entity.Answer</class> 
    <class>core.entity.BaseEntity</class> 
    <exclude-unlisted-classes>true</exclude-unlisted-classes> 
    <validation-mode>NONE</validation-mode> 
    <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> 
     <property name="hibernate.show_sql" value="true"/> 
     <property name="hibernate.hbm2ddl.auto" value="update"/> 
    </properties> 
</persistence-unit> 

My Answer podmiot: (klasa BaseEntity prostu trzyma klucz podstawowy - ID)

@Entity 
@Table(name = "ANSWER") 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public class Answer extends BaseEntity { 

    @Column(name = "ANSWER_VALUE") 
    private String answerValue; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "QUESTION_ID", nullable = false) 
    private Question question;     

    //overrided equals, hascode, toString 
    // all getters and setters 
} 

Dzwoniąc:

public void remove(T entity) { 
    this.entityManager.remove(this.entityManager.merge(entity)); 
} 

próbował również:

this.entityManager.remove(entity); 

oraz:

T ref = entityManager.getReference(entityClass, primaryKey); 
entityManager.remove(ref); 

Nie traf :(nie usuwa rekord Answer z bazy danych.

Używam konfiguracji wiosny, aby skonfigurować menedżera encji tak:

<bean id="persistenceUnitManager" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager"> 
    <property name="persistenceXmlLocations"> 
     <list> 
      <value>classpath*:META-INF/persistence.xml</value> 
     </list> 
    </property> 
    <property name="defaultDataSource" ref="dataSource"/> 
</bean> 

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitManager" ref="persistenceUnitManager"/> 
    <property name="persistenceUnitName" value="myEntityManager"/> 
</bean> 

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

<tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager"/> 

remove nazywa się w sposób, który jest opatrzony adnotacją z @Transactional adnotacji. Więc nie powinno to być problem z transakcjami.

Mam włączone logowanie w Hibernate SQL, wszystkie inne rejestrowanie. Nie widzę nigdzie, aby zapytanie zostało wykonane lub jakikolwiek błąd.

I naprawdę nie mam tu żadnych opcji. Proszę o poradę.

EDIT

Może to pomóc również:

otrzymuję listę odpowiedzi od innego podmiotu.Odpowiedzi są zdefiniowane następująco:

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "evaluationPart") 
private List<Answer> answers = new LinkedList<>(); 

Wywołanie usunąć tak:

List<Answer> answers = evaluationPart.getAnswers(); 
if (answers != null && answers.size() > 0) { 
    for (Answer answer : answers) { 
     answerFacade.remove(answer); //This calls enetityManager.remove 
    } 
} 
+0

A inne metody tworzenia/aktualizacji działają poprawnie i działają zgodnie z oczekiwaniami? czy są to metody w tej samej klasie i przy użyciu tej samej konfiguracji? – rhinds

+0

Tak. Wszystko inne działa, wszystko jest takie samo dla innych operacji. – user2219247

+0

@rhinds Zaktualizowałem pytanie. Być może teraz zobaczysz problem. – user2219247

Odpowiedz

4

mogę być z tematu, ale mogą to być kwestie dotyczące problemu

Pierwszy powód - Brak definicji cascadeType w tym wpisie:

@ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "QUESTION_ID", nullable = false) 
    private Question question; 

Drugi powód (Więcej z sugestią)

Jako LinkedList odpowiedzi jest mapowany do obiektu zapytania, usuwając jeden obiekt z listy bezpośrednio nie jest zalecana jako dobre praktyki. Lepiej usuń element z listy połączonej, a następnie zaktualizuj/scal obiekt pytania, który automatycznie wykona operację usuwania w tabeli odpowiedzi.

Mam nadzieję, że to pomoże :)

+0

Nie zdefiniowano typu kaskady, ponieważ nie chcę, aby ten obiekt był w jakikolwiek sposób kaskadowany :) w porządku. Twój drugi powód podał sposób rozwiązania. Tak, nie muszę wywoływać elementu entityManager.remove, jeśli usuwam go z listy, więc działało. Dzięki. Nadal nie można w pełni zrozumieć, dlaczego hibernacja nie usunęła kontekstu trwałości. Może dlatego, że obiekty były leniwie załadowane ... – user2219247

+0

Po prostu miałem ten sam problem, byłoby miło, gdyby Hibernate przynajmniej krzyczał na ciebie za usunięcie elementu listy przez wywołanie em.remove (ref). No cóż, lekcja się nauczyła. –

Powiązane problemy