简体   繁体   English

休眠manyToMany仅持久

[英]Hibernate manyToMany only persist

I want to create a manyToMany-Relation in Hibernate with only "persist" as cascade type. 我想在Hibernate中创建一个仅以“ persist”作为级联类型的manyToMany-Relation。

My meal class looks like this: 我的用餐课程如下所示:

public class Meal {
    @ManyToMany(cascade = {CascadeType.PERSIST})
    @JoinTable(name="meal_ingredient_relation",
            joinColumns={@JoinColumn(name="meal_id")},
            inverseJoinColumns={@JoinColumn(name="ingredient_id")})
    private Set<Ingredient> ingredients = new HashSet<>();
    ...
}

And my ingredient class looks like this: 我的配料课看起来像这样:

public class Ingredient {
    @ManyToMany(mappedBy = "ingredients", cascade = {CascadeType.PERSIST})
    private Set<Meal> meals = new HashSet<>();
    ...
}

If I want to create some meals with some ingredients 如果我想用一些食材做饭

SessionFactory sf = HibernateUtil.getSessionFactory();
Session session = sf.openSession();
session.beginTransaction();

Ingredient ingredient1 = new Ingredient("in1");
Ingredient ingredient2 = new Ingredient("in2");

Meal meal1 = new Meal("meal1", 100);
Meal meal2 = new Meal("meal2", 200);

meal1.getIngredients().add(ingredient1);
meal1.getIngredients().add(ingredient2);
meal2.getIngredients().add(ingredient1);

session.save(meal1);
session.save(meal2);

I get the following error: 我收到以下错误:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: hibernate.entities.Ingredient

You have to add an annotation to your setIngredients in the Meal class: 您必须在Meal类中为setIngredients添加注释:

@Cascade({CascadeType.SAVE_UPDATE, CascadeType.DELETE})

Or if you are using XML mapping: 或者,如果您使用的是XML映射:

<set name="ingredients" cascade="save-update, delete" ...

obviously use DELETE only if needed. 显然,仅在需要时才使用DELETE

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM