JPA /休眠删除实体不工作 [英] JPA/Hibernate remove entity not working

查看:99
本文介绍了JPA /休眠删除实体不工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

主要方法:

  / ** 
*接受发送给您的邀请。
*
* @param inviteId
*返回EventMember的XML模型。
* /
@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);

code $


AbstractJpaDao类(由所有DAO类继承):

  public abstract class AbstractJpaDao< T>实现JpaDao< T> {
抽象公共EntityManager getEntityManager();

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

$ b @Transactional(isolation = Isolation.DEFAULT,propagation = Propagation.REQUIRED)
public T store(final T objectToPersist){
T result = getEntityManager( ).merge(objectToPersist);
返回结果;
}

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


$ / code>

EventInvite域名类:

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

@Column(name =EventInviteID,nullable = false)
@Basic(fetch = FetchType.EAGER)
@Id
@GeneratedValue(strategy = GenerationType .IDENTITY)
私人长eventInviteId;
$ b @ManyToOne(fetch = FetchType.EAGER)
@JoinColumns({@JoinColumn(name =EventID,referencedColumnName =EventID,nullable = false)})
私人活动事件;

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

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

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumns({@JoinColumn(name =UserID,referencedColumnName =UserID)})
私人用户用户;

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());
返回结果;

$ b @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;
返回true;
}

}

关于什么问题可能存在的任何想法是否或如何进行调试?

解决方案

它是因为 EventInvite 跨越交易界限?您将实体加载到一个事务中,并将其删除。

包含接受邀请的完整业务逻辑,因为它是单个逻辑操作。这样做也会将表示层从模型中分离出来,以便通过短信或电子邮件启用接受邀请。


I'm using a JPA interface to Hibernate, and I've written some simple code to load an entity from the database and then remove (delete) it. All of my merge calls to insert and update entities are working perfectly, but when I try to remove an entity, Hibernate doesn't delete it from the database, and no exception is thrown. I've included the relevant code below:

Primary method:

/**
 * 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 class (inherited by all DAO classes):

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 domain class:

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

}

Any ideas about what the problem might be or how to debug it?

解决方案

Is it getting confused because the EventInvite crosses transaction boundaries? You load the entity in one transaction and delete it in another.

Instead, create a new @Transactional method that contains the complete business logic for accepting an invite as it is a single logical operation. Doing so will also separate the presentation layer from the model for when you want to enable accepting invitations via SMS or email.

这篇关于JPA /休眠删除实体不工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆