[英]Hibernate, many to one, update
我的實體:
@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是的,電影和類別具有Entity批注。
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>
我不太相信您真的打算 只更改類別名稱。 但是您的問題是由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 標簽Wiki很有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.