2013-03-28 30 views
5

Hibernate 4.1.4.Final uygulaması üzerinde JPA kullanıyorum. Benim sorunum, EntityManager#remove() çalışamıyorum. Diğer tüm: güncelleme, ekleme, seçme işlemi bunun dışında gayet iyi çalışıyor.Hazırda bekleme ile JPA kullanımı: entityManager.remove - çalışmıyor

Benim persistence.xml dosyası: (BaseEntity sınıfı sadece birincil anahtarı tutuyor - ID) çağrılırken

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

:

Benim Answer varlık

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

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

Ayrıca çalıştı:

this.entityManager.remove(entity); 

Ve:

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

Hiçbir şans :(o veritabanından Answer rekorunu silme değildir. Böyle varlık yöneticisi yapılandırmak için Bahar yapılandırmasını kullanıyorum

:

<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@Transactional ek açıklamasıyla açıklamalı yöntemde denir. Yani işlem sorunu olmamalı.

Hazırda bekletme SQL günlüğünü, tüm diğer günlüğe kaydetmeyi etkinleştirdim. delete sorgusunun yürütüleceği veya herhangi bir hata görmeyeceğim.

Ve gerçekten burada seçeneklerimin dışındayım. Lütfen tavsiye.

DÜZENLEME Belki bu da yardımcı olacaktır:

Diğer varlıktan cevapların listesini alıyorum.cevaplar şöyle tanımlanmıştır:

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

böyle kaldırmak çağrılması:

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

Ve diğer Oluşturma/Güncelleştirme yöntemleri tüm işlemler tamam ve beklendiği gibi devam ediyor? Aynı sınıftaki ve aynı kurulumu kullanan yöntemler nelerdir? – rhinds

+0

Evet. Diğer her şey çalışıyor, diğer işlemler için her şey aynı. – user2219247

+0

@rhinds Soruyu güncelledim. Belki şimdi sorunu görebileceksiniz. – user2219247

cevap

4

Ben konunun dışında olabilir ama bunlar sorun

İlk Nedeni için sorunlar olabilir - Bu girişte tanımlanmış cascadeType yok

İkinci Sebep (bir öneri Daha) Yanıtla LinkedList olarak

doğrudan iyi bir uygulama olarak tavsiye edilmez listeden tek bir nesne silme Soru nesneye eşlenir. Öğeyi bağlantılı listeden daha iyi kaldırın ve sonra da Yanıt tablosunda otomatik olarak kaldırma işlemini gerçekleştirecek soru nesnesini güncelleyin/birleştirin.

Bu yardımcı olur :)

+0

Bu nesnenin herhangi bir şekilde kaskat edilmesini istemediğim için kaskad türü tanımlanmadı. İkinci nedenin çözümü için bir yol verdi. Evet, listeden çıkarırsam entityManager.remove'u çağırmam gerek, bu yüzden işe yaradı. Teşekkürler. Hala hazırda bekletme durumunun neden kalıcı olmadığının tam olarak anlaşılamaması. Belki de nesneler tembel yüklü olduğu için ... – user2219247

+0

Sadece aynı sorunu vardı, eğer Hazırda beklet, em.remove (ref) çağırarak bir liste öğesini kaldırmak için en azından sana bağırırsa iyi olur. Oh, ders öğrendim. –

İlgili konular