当前位置: 首页 > 知识库问答 >
问题:

java.lang.IllegalState异常:在同步期间,通过未标记级联PERSIST的关系发现了一个新对象

姜彬郁
2023-03-14

我有两个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; 

我想用这种方式创建一个新的recipie:

List<Ingredient> ingredientsList = new ArrayList<>();


String ingredientName = "example";

Ingredient ingredient = ingredientsDao.findIngredientByName(ingredientName);

if (ingredient == null) {
   ingredient = new Ingredient();
   ingredient.setName(ingredientName);

}
ingredientsList.add(ingredient);
.....
recipie.setIngredients(ingredientsList);
recipiesDao.addRecipie(recipie);

如果数据库中不存在成分,则会出现如下错误

Caused by: java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST

有没有办法自动添加表中创建的对象?

我尝试添加CascateType. PERSIST但它也不工作

@ManyToMany(mappedBy = "ingredients", cascade = CascadeType.PERSIST) 
private List<Recipie> recipies; 

共有2个答案

刁远
2023-03-14

正如@Gimby所提到的,您需要分配关系的双方。

在处理@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<>(); 

    ...
}

然后你的逻辑有一点变化:

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);

然后应该正确地进行级联持久化/更新。

真正的乐趣将从你试图找出如何将数量与配料联系起来开始。。。

祝花蜂
2023-03-14

首先,对于双向关系,双方都需要更新,因此:

recipe.getIngredients().add(ingredient);
ingredient.getRecipes().add(recipe);

然后,可以在传递给save()的关系一侧将级联设置为PERSIST。因此,如果要保存配方,则应标记配方。配料

@ManyToMany(cascade = CascadeType.PERSIST)

(旁注,拼写为“recipe”,而不是“recipie”)

 类似资料:
  • 这是我的第一篇帖子,如果我有任何错误,请原谅我。 当我想查询(添加,编辑,删除)数据库时,我得到一个错误java.lang.IllegalStateExctive:在同步期间,通过未标记为级联PERSIST的关系找到了一个新对象。 相关表格包括赞助商和捐款。它们之间存在一对多的关系。以下课程:赞助商 捐款:

  • 在试图获得文章和之间的关系时,我可能没有完全正确的映射,导致: 文章: 海德菲尔德: 实体已经更新,以反映使用的建议,这似乎可以修复特定的错误消息。我正在努力生成一个更有用的日志来跟踪发生的事情。

  • 我在下面尝试捕获JSON解析错误: 为什么在处理上述异常时,打印出另一个异常,以及如何解决它?

  • 问题内容: 我发布了一个问题修复程序(在下面说明),但无法确认它是否可以解决问题。使用Java 7的人可以尝试以下Applet并进行报告吗?不胜感激。 音频混合器演示 向我报告的问题是,需要从震撼的资源中加载声音剪辑的第一行按钮无法正常工作。错误指向正在读取音频文件的行,并指出正在抛出“标记/重置” I / O异常。 该代码适用于Java 6,不适用于Java 7。 内部区域返回一个,我认为这就是

  • 问题内容: 我有一个关于Hibernate的一般性问题,我正在与之讨论。 我有A类和B类,其中B依赖于A 在我的代码中,当我调用em.persist(objOfTypeA)时,我希望插入内容能够插入到表AAA和BBB中。如果我手动使用A获取A的ID并将其填写在每个对象的列表中,然后保留该列表,则说明一切正常。但是我希望Hibernate 能够 神奇地 做到这一点。 难道我做错了什么?还是我只是对H