我的实体:
@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>
答案 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有用。