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
}
}
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
Sì. Tutto il resto funziona, tutto è lo stesso per altre operazioni. – user2219247
@rhinds Ho aggiornato la domanda. Forse saresti in grado di vedere il problema ora. – user2219247