2013-12-12 33 views
1

我的實體: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> 
+0

我把它'電影'註釋'@實體'以及?另外,請顯示您想要更改'Film.category'的代碼,以及'updateFilm'持續/合併/更新實體的方式。 – mabi

+0

你是想爲電影選擇一個新的'類別',還是你想改變這個類別的名字? – mabi

+0

是的,此外:System.out.println(「AAAAAAAAAAAAAAAAAAAA + lastEdited.getCategory()。getName());從saveAction()寫入新的類別,但更新後,我仍然有舊類 – user2519456

回答

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有幫助。

+0

我添加了CascadeType.PERSIST,CascadeType.MERGE。但是我的問題依然存在,我沒有任何可能改變類別 – user2519456

+0

I我不想改變表類別中的類別名稱,我只想更改實體電影的電影類別(我想在電影表中爲類別ID更改外鍵) – user2519456

+0

@ user2519456我更新了答案,這有幫助嗎? – mabi

相關問題