【问题标题】:Spring / JPA : saving entities having association entitiesSpring / JPA:保存具有关联实体的实体
【发布时间】:2018-08-30 03:06:44
【问题描述】:

我有以下实体:产品和通道。一个产品可以在一个或多个通道中,一个通道可以有一个或多个产品。 还有一个实体推销员。销售员负责过道中的产品:

@Entity 
public class Product{
   @Id
   private Long id;
   private String name;
   @OneToMany(mappedBy = "product")
   private Set<ProductAisle> productAisle = new HashSet<>;
   /* getters, setters, equals and hashcode */
}


@Entity 
public class Aisle{
   @Id
   private Long id;
   private String row;
   private String shelf;
   @OneToMany(mappedBy = "aisle")
   private Set<ProductAisle> productAisle = new HashSet<>();
   /* getters, setters, equals and hashcode */
}

@Entity 
public class ProductAisle{
   @Id
   private Long id;
   @ManyToOne(fetch = FetchType.LAZY)
   private Product product;
   @ManyToOne(fetch = FetchType.LAZY)
   private Aisle aisle;
   /* getters, setters, equals and hashcode */
}
@Entity 
public class Salesman{
   @Id
   private Long id;

   private String name;

   @ManyToOne(fetch = FetchType.LAZY)
   private Set<ProductAisle> productAisle;

}

为简单起见,我通过扩展 JpaRepositoryClass 为每个实体创建了一个存储库:

public interface SalesmanRepo extends JpaRepository<Salesman, Long>{}
public interface ProductAisleRepo extends JpaRepository<ProductAisle, Long>{}
public interface AisleRepo extends JpaRepository<Aisle, Long>{}
public interface ProductRepo extends JpaRepository<Product, Long>{}

问题是我觉得这不是要走的路。 例如,当我尝试添加Salesman 时,我需要检查Product 是否存在。如果没有,我会通过它的存储库持久保存它。 然后我必须检查Aisle 是否存在。如果不是,我通过它的存储库坚持它。 接下来,我必须在ProductAisle 存储库中找到一条记录,或者创建一条记录。 最后,我可以保存Salesman

问题:保存与关联实体连接的实体的方法是什么?我可以在不进行所有检查的情况下保存主要实体 (Salesman) 吗?

问候

【问题讨论】:

    标签: spring jpa spring-data-jpa


    【解决方案1】:

    我可能没有 100% 关注您的问题;但听起来您希望在插入其他实体时创建依赖实体?

    在这种情况下,您可以尝试:cascade = CascadeType.PERSIST。这里的相关答案中有关于它的注释:https://stackoverflow.com/a/33786248/857994

    另外,这里有一个链接:https://docs.oracle.com/cd/E19798-01/821-1841/bnbqm/index.html,它解释了:

    PERSIST - 如果父实体被持久化到持久化上下文中,相关实体也将被持久化。

    【讨论】:

    • 是的,这是一个全新的记录。但是如果我想重用像ProductAisle(关联表)这样的实体,我是否有义务首先尝试获取这些项目,检查它们是否在表中。如果没有,接下来插入它们?我觉得我做错了事。每个实体一个存储库?这是要走的路吗?
    猜你喜欢
    • 2014-09-25
    • 2013-05-09
    • 1970-01-01
    • 2013-04-03
    • 2018-12-02
    • 2023-03-16
    • 2015-08-10
    • 1970-01-01
    • 2021-03-27
    相关资源
    最近更新 更多