我使用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)如何工作,尽管我在测试期间没有遇到任何问题 - 但是。
所以我的问题是:
@PreAuthorize
和类似注释附加到各个存储库的每个方法的Spring Security检查