如何在弹簧数据jpa中使用现有ID

时间:2017-04-11 08:29:55

标签: hibernate spring-data-jpa spring-data-rest

我使用Spring Data JPA(和REST)实现了一个Spring Boot应用程序,需要支持基于上传或服务器上配置文件的实体创建。我使用

注释的触发器方法创建了一个服务
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)

该方法应该创建许多结构与以下类似的实体:

@Entity
@Table(name = "T_PARENT")
public class Parent {
  @Id
  @Column(...)
  @GeneratedValue(generator = "customUUID")
  UUID id;

  @OneToMany(fetch = FetchType.LAZY)
  @JoinColumn(name = "PARENT")
  @Cascade(CascadeType.ALL)
  Collection<Child> children;
}

@Entity
@Table(name = "T_CHILD")
@IdClass(...)
public class Child {

  @Id
  @ManyToOne(fetch = FetchType.LAZY, optional = false)
  @JoinColumn(name = "PARENT", nullable = false, updatable = false)
  @Cascade(value = { CascadeType.MERGE, CascadeType.DETACH })
  Parent parent;

  @Id
  @Column(name = "NAME", nullable = false, updatable = false)
  private String name;
}

Parent只有一个存储库(不适用于Child实体)。必须导入ID值,以便使用自定义生成器;这解决了类似于@Id @GeneratedValue but set own ID value中记录的问题。

这允许首先保存父实体,然后设置父级列表,将父级设置为刚创建的父级(parentRepository.save(...)返回的对象),然后再次保存父实体。在此方案中需要@Cascade注释,因为否则会遇到Spring data jpa detached entity中记录的问题。

如果未首先保存父级,则会导致PersistentObjectException传递的&#34;分离实体持续存在&#34;。如果ID保留为null,则单个保存有效。

虽然这有效,但在服务层中感觉太多了。当然,这是ORM框架应该能够处理的事情。我也有点担心添加两个@Cascade注释可能会干扰Spring Data(JPA / REST)如何工作,尽管我在测试期间没有遇到任何问题 - 但是。

所以我的问题是:

  1. 使用自定义生成器设置ID时,是否有更好的方法可以将实体(包括所有相关实体)保存在单个保存中?
  2. 期望注释不会导致Spring Data实现出现问题是否合理?
  3. PS:我知道我可以让EntityManager自动连接并使用它进行保存,但是我会丢失(或维护一致的重复实现)使用@PreAuthorize和类似注释附加到各个存储库的每个方法的Spring Security检查

0 个答案:

没有答案