我有两个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;
正如@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);
然后应该正确地进行级联持久化/更新。
真正的乐趣将从你试图找出如何将数量与配料联系起来开始。。。
首先,对于双向关系,双方都需要更新,因此:
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