我有一个现有的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问题,因为我的方法如何保存位置列表是我面临这个问题的原因。我很欣赏任何暗示这一点的提示。
答案 0 :(得分:0)
你做得不对。
首先,不清楚为什么要制作@OneToMany
方@Transient
。
最好是使用JPA的级联功能。
在您的示例中,如果您放置:
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval=true)
private List<Position> positions;
Order
上的所有操作都会在Position
上级联,因此您无需明确管理它们。
使用Hibernate
查看这些examples