Jpa java.lang.IllegalStateException:在同步过程中,通过未标记为cascade PERSIST的关系找到了一个新对象
我有两个与多对多相关的2类Jpa java.lang.IllegalStateException:在同步过程中,通过未标记为cascade PERSIST的关系找到了一个新对象,jpa,many-to-many,cascade,illegalstateexception,persist,Jpa,Many To Many,Cascade,Illegalstateexception,Persist,我有两个与多对多相关的2类 @Entity @Table(name = "recipies") public class Recipie implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String url; private String image; @ManyToMany @JoinT
@Entity
@Table(name = "recipies")
public class Recipie implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String url;
private String image;
@ManyToMany
@JoinTable(
name = "recipie_ingredients",
joinColumns = {
@JoinColumn(name = "recipie_id", referencedColumnName = "id")},
inverseJoinColumns = {
@JoinColumn(name = "ingredient_id", referencedColumnName = "id")})
private List<Ingredient> ingredients = new ArrayList<>();
@Entity
@Table(name = "ingredients")
public class Ingredient implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
@ManyToMany(mappedBy = "ingredients")
private List<Recipie> recipies;
有没有办法自动在表中创建成分对象
我尝试添加CascadeType.PERSIST,但它也不起作用
@ManyToMany(mappedBy = "ingredients", cascade = CascadeType.PERSIST)
private List<Recipie> recipies;
首先,对于双向关系,双方都需要更新,因此:
recipe.getIngredients().add(ingredient);
ingredient.getRecipes().add(recipe);
然后,您可以将级联设置为在要保存的关系一侧保持。因此,如果您正在保存配方,则应使用
旁注,这是拼写的recipe,而不是@Gimby提到的recipie,您需要分配关系的双方 在处理@Many。。。侧面关系我总是初始化您在一侧完成的集合:
@Entity
@Table(name = "recipies")
public class Recipie implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String url;
private String image;
@ManyToMany
@JoinTable(
name = "recipie_ingredients",
joinColumns = {
@JoinColumn(name = "recipie_id", referencedColumnName = "id")},
inverseJoinColumns = {
@JoinColumn(name = "ingredient_id", referencedColumnName = "id")})
private List<Ingredient> ingredients = new ArrayList<>();
...
}
@Entity
@Table(name = "ingredients")
public class Ingredient implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
@ManyToMany(mappedBy = "ingredients")
private List<Recipie> recipies = new ArrayList<>();
...
}
然后应该正确级联持久化/更新
真正有趣的是,当你试图找出如何将数量与配料关联起来时……当你使用许多配料时,你需要同时更新配料和配方中的集合。所以你把配方加到配料里,然后把配料加到配方里。你在这么做吗?不,我的新配料不存在于数据库中。JPA应该在配料表和关系中自动创建适当的记录。这样做的方法是什么?那个回答只意味着你们不明白我在说什么。但是Adam和Steve在他们的答案中解释得更好。cascade=CascadeType。将这些重复记录保存在数据库中。我正在循环中添加Recipes。如果您在DB中获得重复记录,那么您的代码可能比您发布的更多。如果事务或实体管理器未正确使用或实体模型不正确,则可能发生这种情况。不能说没有看到更多的代码。如果使用得当,CascadeType.PERSIST不应复制任何记录。
recipe.getIngredients().add(ingredient);
ingredient.getRecipes().add(recipe);
@ManyToMany(cascade = CascadeType.PERSIST)
@Entity
@Table(name = "recipies")
public class Recipie implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String url;
private String image;
@ManyToMany
@JoinTable(
name = "recipie_ingredients",
joinColumns = {
@JoinColumn(name = "recipie_id", referencedColumnName = "id")},
inverseJoinColumns = {
@JoinColumn(name = "ingredient_id", referencedColumnName = "id")})
private List<Ingredient> ingredients = new ArrayList<>();
...
}
@Entity
@Table(name = "ingredients")
public class Ingredient implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
@ManyToMany(mappedBy = "ingredients")
private List<Recipie> recipies = new ArrayList<>();
...
}
String ingredientName = "example";
Ingredient ingredient = ingredientsDao.findIngredientByName(ingredientName);
if (ingredient == null) {
ingredient = new Ingredient();
ingredient.setName(ingredientName);
}
...
// Don't forget to assign both sides of the relationship
recipe.getIngredients().add(ingredient);
ingredient.getRecipies().add(recipe);
recipiesDao.addRecipe(recipe);