Spring Data JPA。删除没有反映在mysql数据库中

时间:2015-07-04 11:28:24

标签: spring hibernate jpa

我正在使用Spring JPA来存储User和Service之间的多对多关系。由于桥表包含其他列,因此我将其建模为具有两个多对一关系。两者都是双向的。此外,Acquisition实体与ServiceConfiguration具有一对一的关系。

保存或检索任何这些实体都没有问题。但是当我尝试删除这样的收购时:

@Override
@Transactional
public void removeUsersServiceAcquisition(Long serviceId, User user) {
    Service service = getService(serviceId);
    Acquisition acquisition = findAcquisitionByServiceAndUser(service, user);
    acquisitionRepository.delete(acquisition.getId());

    log.info("\n retrieved acquisition {} ", acquisitionRepository.findOne(acquisition.getId()));
}

更改未反映在数据库中。上述方法中的后续查找返回null。但是后来在代码和数据库中存在记录。没有例外被抛出。

@Entity
@Table(name="ACQUISITION")
public class Acquisition implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")  
    public Long getId() {
        return id;
    }

    @ManyToOne
    @JoinColumn(name="user_id") 
    public User getUser() {
        return user;
    }

    @ManyToOne
    @JoinColumn(name="service_id")  
    public Service getService() {
        return service;
    }

    @OneToOne(mappedBy="acquisition")
    public ServiceConfiguration getConfiguration() {
       return configuration;
    }
}

@Entity
@Table(name="USER")
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")  
    public Long getId() {
        return id;
    }

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval=true)
    public Set<Acquisition> getAcquisitions() {
        return acquisitions;
    }
}


@Entity
@Table(name="SERVICE")
public class Service implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    public Long getId() {
        return id;
    }

    @OneToMany(mappedBy="service", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval= true)
    public Set<Acquisition> getAcquisitions() {
        return acquisitions;
    }
}


@Entity
@Table(name="SERVICE_CONFIGURATION")
public class ServiceConfiguration implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")  
    public Long getId() {
        return id;
    }

    @OneToOne
    @JoinColumn(name="acquisition_id")
    public Acquisition getAcquisition() {
        return acquisition;
    }
    public void setAcquisition(Acquisition acquisition) {
        this.acquisition = acquisition;
    }
}

1 个答案:

答案 0 :(得分:1)

以下是我为此付出的努力。

删除方法更改为首先从它参与的两个关系中删除获取:

@Transactional
public void removeUsersServiceAcquisition(Long serviceId, User user) {
    Service service = getService(serviceId);
    Acquisition acquisition = findAcquisitionByServiceAndUser(service, user);
    service.getAcquisitions().remove(acquisition);
    user.getAcquisitions().remove(acquisition);

    acquisitionRepository.delete(acquisition.getId());

    log.info("\n retrieved acquisition {} ", acquisitionRepository.findOne(acquisition.getId()));
}

这导致了“无会话”Hibernate异常。

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.netstellar.sitesuite.serviceregistry.site.model.User.acquisitions, could not initialize proxy - no Session

我通过向用户映射添加fetch属性来处理。不确定这是否是解决此异常的唯一方法。

@OneToMany(mappedBy = "user", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval=true)
public Set<Acquisition> getAcquisitions() {
    return acquisitions;
}