2013-03-28 8 views
5

Ich verwende JPA über Hibernate 4.1.4.Final Implementierung. Mein Problem ist, dass ich EntityManager#remove() nicht arbeiten kann. Alle anderen: update, insert, select operation funktionieren gut außer dieser.Verwenden von JPA mit Hibernate-Implementierung: entityManager.remove - funktioniert nicht

Meine persistence.xml Datei:

<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> 

Meine Answer Einheit: (BaseEntity Klasse hält nur den Primärschlüssel - 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 
} 

Beim Aufruf:

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

auch versucht:

this.entityManager.remove(entity); 

Und:

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

Kein Glück :(es den Rekord von Answer aus der Datenbank nicht gelöscht werden.

I Spring-Konfiguration bin mit dem Entity-Manager wie diese zu konfigurieren:

<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 wird in dem Verfahren genannt, die mit @Transactional Anmerkung kommentiert wird. Es sollte also kein Transaktionsproblem sein.

Ich habe Hibernate SQL-Protokollierung aktiviert, alle anderen Protokollierung. Ich sehe nirgendwo, dass delete Abfrage ausgeführt würde oder irgendein Fehler überhaupt.

Und ich habe wirklich keine Optionen hier. Bitte um Rat.

EDIT

Vielleicht wird auch helfen:

ich die Liste der Antworten von der anderen Entität bin immer.Die Antworten sind wie folgt definiert:

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

Aufruf wie folgt entfernen:

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

Und Ihre anderen Create/Update-Methoden alle funktionieren ok und bestehen wie erwartet? sind diese Methoden in der gleichen Klasse und verwenden das gleiche Setup? – rhinds

+0

Ja. Alles andere funktioniert, alles ist bei anderen Operationen gleich. – user2219247

+0

@rhinds Ich habe die Frage aktualisiert. Vielleicht könntest du das Problem jetzt sehen. – user2219247

Antwort

4

ich aus dem Thema sein können, aber das sind die Themen für das Problem sein kann

erste Grund - Kein cascadeType in diesem Eintrag definiert

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

zweiter Grund (Mehr ein Vorschlag)

Als LinkedList der Antwort auf die Frage Objekt abgebildet, ein einzelnes Objekt aus der Liste zu löschen ist nicht direkt als eine gute Praxis empfohlen. Entfernen Sie das Element besser aus der verknüpften Liste, und aktualisieren/fusionieren Sie dann das Frageobjekt, das den Löschvorgang automatisch in der Antworttabelle ausführt.

Hoffe, das hilft :)

+0

Kein Kaskadentyp ist definiert, weil ich nicht möchte, dass dieses Objekt in irgendeiner Weise kaskadiert wird :) das ist in Ordnung. Ihr zweiter Grund gab einen Weg zur Lösung. Ja, ich muss den entityManager.remove nicht aufrufen, wenn ich ihn aus der Liste entferne, damit das funktioniert. Vielen Dank. Kann immer noch nicht vollständig verstehen, warum Hibernate den Persistenzkontext nicht gelöscht hat. Vielleicht, weil die Objekte faul geladen waren ... – user2219247

+0

Hatte nur das gleiche Problem, es wäre schön, wenn Hibernate Sie mindestens anschreien würde, um ein Listenelement durch Aufruf von em.remove (ref) zu entfernen. Naja, Lektion gelernt. –

Verwandte Themen