首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >春季数据JPA.删除未反映在mysql数据库中

春季数据JPA.删除未反映在mysql数据库中
EN

Stack Overflow用户
提问于 2015-07-04 11:28:23
回答 1查看 1.8K关注 0票数 2

我使用Spring来存储用户和服务之间的多到多关系,以及表的获取。由于桥表包含额外的列,所以我将其建模为具有两个多对一的关系。两者都是双向的。此外,收购实体与ServiceConfiguration有一对一的关系.

保存或检索这些实体没有问题。然而,当我试图删除这样的收购:

代码语言:javascript
复制
@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。但在后面的代码和数据库中,记录仍然存在。没有异常被抛出。

代码语言:javascript
复制
@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;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-13 16:54:26

我就是为了让这件事起作用而做的。

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

代码语言:javascript
复制
@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异常。

代码语言:javascript
复制
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属性来处理这个问题。不确定这是否是解决此异常的唯一方法。

代码语言:javascript
复制
@OneToMany(mappedBy = "user", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval=true)
public Set<Acquisition> getAcquisitions() {
    return acquisitions;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31220085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档