防止级联插入JPA



我有两个类:

public class Order{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Long id;
@ManyToOne(fetch = FetchType.LAZY)
Status status;
}
public class Status{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Long id;
String description;
}

当我调用Spring的JPARepository来保存Order时,jpa试图保存一个新的Status行,但实际上我只想保存Order和Status之间的关系。我的状态表永远不应该更改。如何防止在"状态"表中进行第二次插入?

例外:

"org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing

"订单"表具有ID(PK(、StatusId(FK("状态"表有ID(PK(,描述

您可以在关系注释中指定要级联的操作,请参阅cascade((,如

@ManyToOne(fetch=..., cascade={CascadeType.DETACH,CascadeType.REFRESH})

请注意,我们指定哪些操作要级联,这意味着而不是级联其他操作。

如果状态可以有多个订单,您应该将关联控件移动到状态类,并在那里有带有oneToMany注释的订单列表。此外,最好使用双向关联,而不是单向关联。总之,在您的情况下,正确的映射如下所示:

public class Order{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Long id;
@ManyToOne(fetch = FetchType.LAZY)
Status status;
}

public class Status{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Long id;
String description;
@OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="status")
List<Order> orders;
}

THis是一个非常基本的概念。由于你使用@GeneratedValue,每次你保存和创建新行时,它都会生成新的id。

最新更新