Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa java.lang.IllegalStateException:在同步过程中,通过未标记为cascade PERSIST的关系找到了一个新对象_Jpa_Many To Many_Cascade_Illegalstateexception_Persist - Fatal编程技术网

Jpa java.lang.IllegalStateException:在同步过程中,通过未标记为cascade PERSIST的关系找到了一个新对象

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

我有两个与多对多相关的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
@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);