Hibernate有很多对很多 - 连接表是空的

时间:2015-02-03 14:08:52

标签: java hibernate many-to-many

我想在Java Hibernate中建立多对多关系的模型 我希望图形有许多类别和类别分配给多个图形 我的java类代码的一部分:

@Entity
@Table(name = "graphic")
public class Graphic {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int graphicId;
    @ManyToMany
    private Set<Category> categories = new HashSet<Category>(0);
    // ...
}

@Entity
@Table(name = "category")
public class category {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int categoryId;
    // ...
}

我已经完成的步骤:
1.创建Category实例 2.在数据库中添加了类别 3.创建Graphic实例 4.为图形集添加了类别 5.在数据库中添加了图形。

结果:categorygraphic实例中的记录正常。表graphic_category已创建,但为空。因此,连接hql查询不会返回任何行 我将非常感谢您如何解决此问题。

编辑:代码为步骤:

//In DBUtil
/**
 * Gets category. If none exists creates new.
 */
public Category getCategory(String name) {
    String hql = "From Category K where K.name = '" + name + "'";
    Query query = session.createQuery(hql);
    if (query.list().isEmpty()) {
        return saveCategory(name);
    } else {
        return (Category)query.list().get(0);
    }
}

public Category saveCategory(String name) {
    Category kat = new Category(name);
    session.save(kat);
    return kat;
}

public Graphic saveGraphic(Graphic g) {
    session.save(g);
    return g;
}


//In unit test
Category kat1 = dbUtil.getCategory("kat1-g");
Graphic g1 = new Graphic();
g1.getCategories().add(kat1);
dbUtil.saveGraphic(g1);

我已将autocommit设置为true。

2 个答案:

答案 0 :(得分:0)

使用@ManyToMany时,您必须指定哪个表将保存关系。

@ManyToMany
@JoinTable(name="graphic_category",joinColumns={@JoinColumn(name="graphicId")},inverseJoinColumns={@JoinColumn(name="categoryId")})
private Set<Category> categories;

希望它有所帮助!

答案 1 :(得分:0)

好的,我找到了理由 在我的Hibernate配置文件中,我有:

<property name="connection.autocommit">true</property>

即使使用该设置,我也必须在将对象插入数据库后进行session.flush()以进行持久更改。