2011-02-05 17 views
6

Hazırda bekletme için bir JPA arabirimi kullanıyorum ve veritabanından bir varlık yüklemek için bazı basit kodlar yazdım ve sonra sil (sil). Birleştirmeyi eklemek ve güncellemek için varlıklarımın tümü mükemmel çalışıyor, ancak bir varlığı kaldırmaya çalıştığımda, hazırda bekletme onu veritabanından silmez ve hiçbir özel durum atılmaz.JPA/Hazırda bekletme durumunu kaldırılıyor

İlköğretim yöntem: (tüm DAO sınıfları tarafından devralınan)

/** 
* Accept an invite that was sent to you. 
* 
* @param inviteId 
* @return XML model of the EventMember. 
*/ 
@RequestMapping(value="/invites/accept.rest") 
public ModelAndView acceptInvite(@RequestParam final long inviteId) { 
    final EventInvite invite = eventInviteDAO.find(EventInvite.class, eventInviteId); 

    EventMember eventMember = new EventMember(); 
    eventMember.setEvent(invite.getEvent()); 
    eventMember.setUser(invite.getUser()); 
    eventMember = eventMemberDAO.store(eventMember); 

    eventInviteDAO.remove(invite); 

    return getXMLModelAndView("eventMember", eventMember); 
} 

AbstractJpaDao sınıfı:

public abstract class AbstractJpaDao<T> implements JpaDao<T> { 
    abstract public EntityManager getEntityManager(); 

    public <T> T find(Class<T> entityClass, Object primaryKey) { 
     return getEntityManager().find(entityClass, primaryKey); 
    } 

    @Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED) 
    public T store(final T objectToPersist) { 
     T result = getEntityManager().merge(objectToPersist); 
     return result; 
    } 

    @Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED) 
    public void remove(final T objectToDelete) { 
     getEntityManager().remove(objectToDelete); 
    } 
} 

EventInvite alanı sınıfı:

@Entity 
@Table(name = "TEventInvite") 
public class EventInvite implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Column(name = "EventInviteID", nullable = false) 
    @Basic(fetch = FetchType.EAGER) 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long eventInviteId; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumns({ @JoinColumn(name = "EventID", referencedColumnName = "EventID", nullable = false) }) 
    private Event event; 

    @Column(name = "Email") 
    @Basic(fetch = FetchType.EAGER) 
    private String email; 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name = "CreateDate", nullable = false) 
    @Basic(fetch = FetchType.EAGER) 
    private Calendar createDate; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumns({ @JoinColumn(name = "UserID", referencedColumnName = "UserID") }) 
    private User user; 

    public void setEventInviteId(long eventInviteId) { 
     this.eventInviteId = eventInviteId; 
    } 

    public long getEventInviteId() { 
     return this.eventInviteId; 
    } 

    public Event getEvent() { 
     return event; 
    } 

    public void setEvent(Event event) { 
     this.event = event; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public String getEmail() { 
     return this.email; 
    } 

    public void setCreateDate(Calendar createDate) { 
     this.createDate = createDate; 
    } 

    public Calendar getCreateDate() { 
     return this.createDate; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 

    public User getUser() { 
     return user; 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result 
       + ((createDate == null) ? 0 : createDate.hashCode()); 
     result = prime * result + ((email == null) ? 0 : email.hashCode()); 
     result = prime * result + ((event == null) ? 0 : event.hashCode()); 
     result = prime * result + ((user == null) ? 0 : user.hashCode()); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     EventInvite other = (EventInvite) obj; 
     if (createDate == null) { 
      if (other.createDate != null) 
       return false; 
     } else if (!createDate.equals(other.createDate)) 
      return false; 
     if (email == null) { 
      if (other.email != null) 
       return false; 
     } else if (!email.equals(other.email)) 
      return false; 
     if (event == null) { 
      if (other.event != null) 
       return false; 
     } else if (!event.equals(other.event)) 
      return false; 
     if (user == null) { 
      if (other.user != null) 
       return false; 
     } else if (!user.equals(other.user)) 
      return false; 
     return true; 
    } 

} 
Ben aşağıdaki ilgili kodu yer verdik

Sorunun ne olabileceği veya nasıl hata ayıklanacağı hakkında herhangi bir fikir var mı?

+0

kodunuzu eventMemberDAO' (veya eğer böyle değil aslında * DAO * lar ancak * EntityManager sarıcı * s 'senin' AbstractJpaDao' beri kafa karıştırıcı ve olacak * DaoMgr * s). Yukarıdaki örnekte, problemin anlaşılmasını gereksiz yere karmaşıklaştırdığı için düzeltecekseniz hoş olurdu. –

cevap

3

EventInvite işlem sınırlarını aştığı için kafan karışıyor mu? Varlığı bir işlemde yükler ve diğerinde silersiniz. Bunun yerine, tek bir mantıksal işlem olduğu için bir daveti kabul etmek için tüm iş mantığını içeren yeni bir @Transactional yöntemi oluşturun. Bunu yapmak, SMS veya e-posta yoluyla davetleri kabul etmeyi etkinleştirmek istediğinizde, sunum katmanını modelden ayıracaktır.

+0

Sen bir dahisin. Mükemmel çalıştı, teşekkürler David! – Templar

0

Merhaba i Silerken, nasılsa oturum veya işlem öylesine olmaz floş hazırda bekleme kapalı değil ki şüpheli Ne

<property name="hibernate.show.sql" value="true"></property> 

ayarlayarak yürütülen sql görmek 'deneyebilirsiniz hazırda bekletme ve For sonuçları olacak veritabanında görülmez.

+1

JDBC sorgu günlüğünü açtım ve Hazırda Beklet, kaydı silmeye bile çalışmıyor. Ayrıca, eventMemberDAO.store çağrıyı kaldırmadan hemen önce çağrıya devam edilir, bu yüzden bunun bir işlem sorunu olduğunu düşünmüyorum. – Templar

3

Benzer bir sorun yaşadım, bir kategorinin parçası olan bir değeri açıklayan bir sınıfa sahip oldum. Yani değer sınıfı, bir parçası olduğu kategoriye bir referansa sahiptir.

@Entity 
public class CategoryValue extends LouhinObject implements Serializable, Idable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @ManyToOne 
    private Category category; 
} 

el Hazırda bu şekilde çalışır neden, gerçekten bilmiyorum CategoryValue nesnesini kaldırmak başardı önce null kategori alanını ayarlamak zorunda kaldı.

+0

Bu ihtiyacım olan eksik bağlantıydı :-) –

1

Aynı problem vardı. Benim varlığım Kart (aşağıya bakın). Ve bir hesap ve bir istemci için null ayarlayamadım, çünkü veritabanımda boş değerli olmayan çekler var.

public class Card implements Serializable { 
    @ManyToOne 
    @JoinColumn(name="idAcc") 
    private Account account; 
    @ManyToOne 
    @JoinColumn(name="idCl") 
    private Client client; 

Ve bunu silmek için uğraş derken bile silme hakkında sql-isteği görmedik.
em = getEntityManager(); 
    em.getTransaction().begin(); 
    mergedCard = em.merge(card); 
    em.remove(mergedCard); 
    em.getTransaction().commit(); 

yüzden ek açıklamaları bu çözüme

@ManyToOne(cascade=CascadeType.MERGE) 
@JoinColumn(name="idAcc") 
private Account account; 
@ManyToOne(cascade=CascadeType.MERGE) 
@JoinColumn(name="idCl") 
private Client client; 
İlgili konular