Hibernate,多对一,更新

时间:2013-12-12 11:01:24

标签: java hibernate

我的实体:

@Entity
public class Film {
    @Id @GeneratedValue(strategy = IDENTITY)
    private long filmId;

    @ManyToOne
    private Category category;
    //... 
}

@Entity
public class Category implements Comparable {
    @Id @GeneratedValue(strategy = IDENTITY)
    private long id;

    private String name;

    @OneToMany(mappedBy = "category")
    private List<Film> films;
    // ...
}

当我尝试修改记录时:

filmBo.updateFilm(lastEdited);

一切正常,我可能会改变电影名称,持续时间,但我不能改变类别......为什么?

@EDIT 是的,电影和类别都有实体注释。

public void updateFilm(Film film) {
    getHibernateTemplate().update(film);
}
之后,我正确地更改了电影名称和持续时间,只有类别是旧的(未更改)

                                             类别                     

                <h:selectOneMenu value="#{c.category.name}" rendered="#{c.editable}">
                    <f:selectItems value="#{category.getCategoriesList()}" var ="cat"
                                   itemLabel="#{cat.name}" 
                                   itemValue="#{cat.name}"/>
                </h:selectOneMenu>

                <h:outputText value="#{c.category.name}" rendered="#{not c.editable}" />
            </h:column>

            <h:column>

                <f:facet name="header">Action</f:facet>

                <h:commandLink value="Edit" action="#{film.editAction(c)}" 
                               rendered="#{not c.editable}" />

            </h:column>

1 个答案:

答案 0 :(得分:2)

我不太相信你真的打算 只是更改类别名称。但是你的问题是由Hibernate引起的,只是更新你告诉它更新的实体。为了处理其他(已更改的)实体,您需要告诉它,如下所示:

@Entity
public class Film {
    @Id @GeneratedValue(strategy = IDENTITY)
    private long filmId;

    @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
    private Category category;
    //... 
}

修改:由于您只想切换实体,因此您也需要更改xhtml:

<h:selectOneMenu value="#{c.category}" rendered="#{c.editable}">
    <f:selectItems value="#{category.categoriesList}" var ="cat"
                   itemLabel="#{cat.name}" />
    <f:converter converterId="omnifaces.SelectItemsIndexConverter" />
</h:selectOneMenu>

由于您的值现在是一个对象,因此您需要一个转换器。我在这里使用omnifaces'SelectItemsIndexConverter。它假设categoriesList的顺序在页面生命周期内保持不变。请务必查阅文档(或提供您自己的转换器)。您还可以找到selectOneMenu tag wiki有用。