JPA / Hibernate删除实体不起作用

我正在使用Hibernate的JPA接口,我编写了一些简单的代码来从数据库加载实体然后删除(删除)它。 我对插入和更新实体的所有合并调用都工作正常,但是当我尝试删除实体时,Hibernate不会将其从数据库中删除,也不会抛出任何exception。 我在下面列出了相关代码:

主要方法:

/** * 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类(由所有DAO类inheritance):

 public abstract class AbstractJpaDao implements JpaDao { abstract public EntityManager getEntityManager(); public  T find(Class 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域类:

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

关于问题可能是什么或如何调试的任何想法?

它是否因为EventInvite跨越事务边界而变得混乱? 您在一个事务中加载实体并在另一个事务中删除它。

相反,创建一个新的@Transactional方法,该方法包含用于接受邀请的完整业务逻辑,因为它是单个逻辑操作。 这样做还会将表示层与模型分开,以便在您希望通过短信或电子邮件接受邀请时。

我有一个类似的问题,我有一个类,它描述了一个类别的一部分。 因此,value类引用了它所属的类别。

 @Entity public class CategoryValue extends LouhinObject implements Serializable, Idable { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @ManyToOne private Category category; } 

在我能够删除CategoryValue对象之前,我必须手动将category字段设置为null,我真的不知道为什么Hibernate会这样工作。

我有同样的问题。 我的实体是卡(见下文)。 我无法将null设置为帐户和客户端,因为我在数据库中没有空检查。

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

当我试图删除它时,我甚至没有看到关于删除的sql-request。

  em = getEntityManager(); em.getTransaction().begin(); mergedCard = em.merge(card); em.remove(mergedCard); em.getTransaction().commit(); 

所以我通过注释解决了这个问题

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

嗨对于hibernate,您可以尝试通过设置来查看已执行的sql

  

我怀疑的是,当你删除时,不知何故会话或事务没有关闭,所以hibernate不会刷新,结果将不会在数据库中看到。