【问题标题】:Data JPA - Remove entities from repository数据 JPA - 从存储库中删除实体
【发布时间】:2016-02-17 14:27:23
【问题描述】:

我有一个现有的 java 应用程序,我现在使用 spring-boot 和 data jpa 将一些数据保存在数据库中。在我现在转换为@Entity 的一类Order 中,我有一个成员是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...
}

所以我所做的如下,我在Order 的列表中添加了注释@Transient,并在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(..) 获取对应存储库中的职位。

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

所以我的问题是,是否有更好的方法来删除存储库中被应用程序删除的位置。但也许这将是一个 XY 问题,因为我的方法如何保存位置列表是我面临这个问题的原因。我感谢任何有关此的提示。

【问题讨论】:

  • "因为我如何保存位置列表的方法是我面临这个问题的原因。"确切地。唯一的问题是你为什么要这么做?
  • 这个问题很容易回答:我不知道如何做得更好;-)
  • 嗯,这是一个基本映射,所以我建议查看文档。下面的答案应该为您指明正确的方向。

标签: java spring jpa


【解决方案1】:

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

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

Order 上的所有操作也会在Positions 上级联,因此您无需显式管理它们。

在 Hibernate 中查看这些 examples

【讨论】:

  • 我还能用这个删除Position中订单的@ManyToOne注释吗?所以我不必在保存订单之前在每个位置都设置它。
  • 不,这是映射外键所必需的。检查this question关于如何使用级联。 stackoverflow.com/questions/3197667/…
  • 我还会从 Position 中删除成员 order,而不仅仅是注释本身。
  • 你想要达到的目标没有意义。如果 Position 上有外键 order_id,则不应删除成员 order 和 @ManyToOne,因为这就是您表示关系的方式。
  • 嗯,我看到已经获得了更多基本的理解。外键是否没有自动添加,但我的 java 对象中没有任何引用?因为我的应用程序不需要Position 类中的引用。
猜你喜欢
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
  • 2011-10-14
  • 2013-08-10
  • 1970-01-01
相关资源
最近更新 更多