2013-03-28 12 views
5

Sto utilizzando l'implementazione JPA su Hibernate 4.1.4.Final. Il mio problema è che non riesco a far funzionare EntityManager#remove(). Tutti gli altri: aggiornamento, inserimento, selezione operazione stanno funzionando bene tranne questo.Utilizzo di JPA con implementazione di Hibernate: entityManager.remove - non funzionante

mio persistence.xml di 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> 

mio Answer entità: (classe BaseEntity solo possiede la chiave primaria - 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 
} 

Quando si chiama:

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

cercato anche:

this.entityManager.remove(entity); 

E:

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

Nessuna fortuna :(non è l'eliminazione il record del Answer dal database.

Sto usando configurazione di Spring per configurare il gestore di entità simile a questo:

<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 è chiamato nel metodo che è annotata con @Transactional annotazione. Quindi non dovrebbe essere un problema di transazioni.

Ho abilitato la registrazione SQL di ibernazione, tutte le altre registrazioni. Non vedo da nessuna parte che la query delete venga eseguita o qualsiasi errore.

E io sono davvero fuori dalle opzioni qui. Per favore consiglio

EDIT

Forse questo aiuterà anche:

sto ottenendo l'elenco delle risposte dal altra entità.Le risposte sono definiti in questo modo:

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

Calling rimuovere in questo modo:

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

E gli altri metodi di creazione/aggiornamento funzionano tutti correttamente e persistono come previsto? sono quei metodi nella stessa classe e utilizzano la stessa configurazione? – rhinds

+0

Sì. Tutto il resto funziona, tutto è lo stesso per altre operazioni. – user2219247

+0

@rhinds Ho aggiornato la domanda. Forse saresti in grado di vedere il problema ora. – user2219247

risposta

4

I può essere fuori del tema, ma questi possono essere i problemi per il problema

prima ragione - No cascadeType definito in questa voce

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

Seconda ragione (più di un suggerimento)

Come il LinkedList di risposta è mappato all'oggetto questione, l'eliminazione di un singolo oggetto dalla lista direttamente non è raccomandato come una buona pratica. Meglio rimuovere l'elemento dall'elenco collegato e quindi aggiornare/unire l'oggetto domanda che eseguirà automaticamente l'operazione di rimozione nella tabella Rispondi.

Spero che questo aiuti :)

+0

Nessun tipo di cascata è definito perché non voglio che questo oggetto sia sovrapposto in alcun modo :) va bene. La tua seconda ragione ha dato il via alla soluzione. Sì, non è necessario chiamare entityManager.remove se lo rimuovo dall'elenco, quindi ha funzionato. Grazie. Non è ancora possibile comprendere appieno il motivo per cui l'ibernazione non ha eliminato il contesto di persistenza. Forse perché gli oggetti erano pigri carichi ... – user2219247

+0

Appena avuto lo stesso problema, sarebbe bello se Hibernate ti urlasse almeno per aver rimosso un elemento della lista chiamando em.remove (ref). Oh bene, lezione imparata. –

Problemi correlati