Data JPA - 从存储库中删除实体

时间:2016-02-17 14:27:24

标签: java spring jpa

我有一个现有的java应用程序,我现在使用spring-boot和data jpa将一些数据保存在数据库中。在我现在转换为Order的一个班级@Entity中,我有一个List<Position>的成员。以下是简化类的代码

@Entity
public class Order
{
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long id;

    private List<Position> positions;

    //some other members follow here...
}

@Entity
public class Position
{
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long id;

    //some members follow here...
}

我所做的就是以下内容,我在@Transient的列表中添加了注释Order,并在Position中添加了对订单的引用:

@Entity
public class Order
{
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long id;

    @Transient
    private List<Position> positions;

    //some other members follow here...
}

@Entity
public class Position
{
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long id;

    @ManyToOne
    private Order order;

    //some members follow here...
}

现在,当我想保存一个Order对象时,我先将Order保存在相应的存储库中,然后浏览Positions列表并设置对Order的引用,然后将Position对象保存到相应的存储库。如果我想获取订单,那么我首先获取订单,然后使用findByOrder(..)在correspoding存储库中获取位置。

到目前为止这是有效的。现在我面临这个问题,如果应用程序在Order中修改了Positions并且我必须使用新的Order对象更新数据库,那么我找不到平滑的解决方案来删除存储库中的Positions应用程序从列表中删除(因为我不再引用已删除的引用)。我可以先删除该订单的所有头寸,然后再保存现有头寸。

所以我的问题是,如果有更好的方法可以删除应用程序删除的存储库中的位置。但也许这将是一个XY问题,因为我的方法如何保存位置列表是我面临这个问题的原因。我很欣赏任何暗示这一点的提示。

1 个答案:

答案 0 :(得分:0)

你做得不对。 首先,不清楚为什么要制作@OneToMany@Transient。 最好是使用JPA的级联功能。 在您的示例中,如果您放置:

@OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval=true)
private List<Position> positions;

Order上的所有操作都会在Position上级联,因此您无需明确管理它们。

使用Hibernate

查看这些examples