【发布时间】:2014-03-15 20:20:49
【问题描述】:
我设法为我的电影插入了工作人员 - 现在我想以正确的方式去做。实体(缩写):
@Entity
@Table(name = "movies")
public class Movie implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int idmovie;
// bi-directional many-to-one association to MoviesHasCrew
@OneToMany(mappedBy = "movy", cascade = CascadeType.PERSIST)
private List<MoviesHasCrew> moviesHasCrews;
}
@Entity
@Table(name = "movies_has_crew")
public class MoviesHasCrew implements Serializable {
@EmbeddedId
@GeneratedValue(strategy = GenerationType.IDENTITY)
private MoviesHasCrewPK id;
// bi-directional many-to-one association to Crew
@ManyToOne
@JoinColumn(name = "crew_idcrew", columnDefinition = "idcrew")
@MapsId("crewIdcrew")
private Crew crew;
// bi-directional many-to-one association to Movy
@ManyToOne
@JoinColumn(name = "movies_idmovie")
@MapsId("moviesIdmovie")
private Movie movy;
// bi-directional many-to-one association to Role
@ManyToOne
@JoinColumn(name = "roles_idrole")
@MapsId("rolesIdrole")
private Role role;
}
@Entity
@Table(name = "crew")
public class Crew implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int idcrew;
// bi-directional many-to-one association to MoviesHasCrew
@OneToMany(mappedBy = "crew", cascade = CascadeType.PERSIST)
private List<MoviesHasCrew> moviesHasCrews;
}
抱歉,“movy”和“crews”是工具(并且有资格获得错误报告)
控制器和表单:
@ManagedBean
@ViewScoped
public class MovieController implements Serializable {
@EJB
private MovieService service;
private Crew crewMember;
private Movie movie;
public String addCrewMember() {
if (movie.getIdmovie() == 0) {
movie = (Movie) FacesContext.getCurrentInstance()
.getExternalContext()
.getSessionMap().get("movie");
}
service.addCrew(movie, crewMember);
return null;
}
}
<h:form id="movie_add_crew_form" rendered="#{sessionScope.movie != null}">
<h:panelGrid columns="2">
<h:selectOneListbox id="crewMember" redisplay="true" size="8"
value="#{movieController.crewMember}"
converter="#{movieController$CrewConverter}">
<f:selectItems value="#{movieController.allCrew}" var="entry"
itemValue="#{entry}" itemLabel="#{entry.name}" />
<f:ajax event="blur" render="crewMemberMessage" />
</h:selectOneListbox>
<h:message id="crewMemberMessage" for="crewMember" />
</h:panelGrid>
<h:commandButton value="Add" action="#{movieController.addCrewMember}">
<f:ajax execute="@form" render="@form :movie_crew" />
</h:commandButton></h:form>
最后是服务:
@Stateless
public class MovieService {
@PersistenceContext
private EntityManager em;
public void addCrew(Movie m, Crew w) {
MoviesHasCrew moviesHasCrew = new MoviesHasCrew();
moviesHasCrew.setCrew(w);
moviesHasCrew.setMovy(m);
moviesHasCrew.setRole(Role.DEFAUT_ROLE);
em.persist(moviesHasCrew);
m.addMoviesHasCrew(moviesHasCrew); // (1)
em.merge(m); // noop
}
}
问题 1:我希望在持久化 MoviesHasCrew 实体时更新 Crew 和 Movie 实体的字段 moviesHasCrews(即删除 m.addMoviesHasCrew(moviesHasCrew); em.merge(m);),但我的级联注释似乎没有做。我应该反过来做吗?这是添加到电影中的moviesHasCrews 和合并/保存电影并更新MoviesHasCrew - 我read 需要休眠,但我使用通用 JPA - 它在原版 JPA 中仍然不可行吗?
问题 2:将不胜感激如何完成此操作(例如,我应该将 fetch=Lazy(在 Movie 和 Crew 中)@Transient 添加到 @987654337 @字段?)。连接表实体中是否需要@MapsId("moviesIdmovie") 等?这是最简单/最优雅的方式吗?
架构:
参考资料:
【问题讨论】:
-
如果 persist() 失败第 (1) 行仍然执行,这是一个问题还是正在发生?,如果坚持失败,它应该不抛出 PersistenceException 吗?
-
@Koitoer:是的,但它是异步的——它正在发生
标签: jpa eclipselink jpa-2.0 entitymanager