gpt4 book ai didi

java - Hibernate,多对一,更新

转载 作者:行者123 更新时间:2023-11-30 04:06:54 28 4
gpt4 key购买 nike

我的实体:

@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);

一切正常,我可以更改电影标题、时长,但无法更改类别...为什么?

@编辑是的,Film 和 Category 有实体注释。

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 tag wiki有帮助。

关于java - Hibernate,多对一,更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20541698/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com