Java Spring boot JPA决定实体的级联顺序

Java Spring boot JPA决定实体的级联顺序,java,spring-boot,jpa,Java,Spring Boot,Jpa,我有3个实体类别,定义如下: @Entity public class Rimorchio { @Id @GeneratedValue private long idrimorchio; @Column(unique = true) private String targa; // .... Getters and Setters } @Entity public class Atk { @Id @GeneratedValue private long idatk; @Colum

我有3个实体类别,定义如下:

@Entity
public class Rimorchio {

@Id
@GeneratedValue
private long idrimorchio;

@Column(unique = true)
private String targa;

// .... Getters and Setters

}


@Entity
public class Atk {

@Id
@GeneratedValue
private long idatk;

@Column(unique = true)
private String codice;

@Column(unique = true)
private String targa;

@OneToOne
private Rimorchio suggerito;

// .... Getters and Setters

}


@Entity
public class Trasportatore {

@Id
@GeneratedValue
private long idtrasportatore;

@Column(unique = true)
private String nometrasportatore;

@OneToMany(cascade = {CascadeType.PERSIST})
private List<Rimorchio> listarimorchi;

@OneToMany(cascade = {CascadeType.PERSIST})
private List<Atk> listaatk;

@OneToMany(cascade = {CascadeType.PERSIST})
private List<Autista> listaautisti;

// .... Getters and Setters

}
因此,我必须在Atk实例之前保存Rimorchio实例。 我有一个结构,其中包含一个扩展JpaRepository的存储库和一个只需调用

 repository.saveAndFlush(trasportatore);

如何确定插入DB的顺序以避免此问题?或者有另一种解决方案(可能避免手动级联操作)来实现此目标?

有什么原因不在OneTONE关系上设置级联持久性?是的,因为Atk中的Rimorchio不是强制性的。如果我在那里插入了层叠,那么一切都很好(我必须从Trasportatore中删除层叠)。问题是没有Rimorchio的Atk可能存在!Cascade persist不会停止或影响这一点——它与强制或非强制引用无关,只与JPA在调用persist并找到对非托管对象的引用时应该做的事情有关。如果您的Atk不存在Rimorchio实例,则需要对其调用persist,但对于已持久化的Atk来说是不可行的。是的,但如果我在OneTONE上添加cascade persist,则会出现SQLIntegrityConstraintViolationException:重复条目。如果仅在OneToOne关系中使用cascade persist,则无法在Trasportatore插入中插入Rimorchio。这些实例是否不同?您需要修复模型,以便在X->Y->Z->X',X==X'中。X在持久化之后(甚至在提交或刷新之后)才会设置ID,因此JPA无法知道这些ID代表相同的数据。如果“targa”字符串用于唯一标识实例行,则您可能希望将其用作ID,这可能有助于您获得重用此对象图中相同实例的句柄。
 repository.saveAndFlush(trasportatore);