0

这是我的实体:

@Entity
public class Actor {

    private List<Film> films;

    @ManyToMany
    @JoinTable(name="film_actor",
    joinColumns =@JoinColumn(name="actor_id"),
    inverseJoinColumns = @JoinColumn(name="film_id"))
    public List<Film> getFilms(){
        return films;
    }

//... more in here

继续:

@Entity
public class Film {

    private List actors;

    @ManyToMany
    @JoinTable(name="film_actor",
            joinColumns =@JoinColumn(name="film_id"),
            inverseJoinColumns = @JoinColumn(name="actor_id"))
    public List<Actor> getActors(){
        return actors;
    }
//... more in here

和连接表:

@javax.persistence.IdClass(com.tugay.sakkillaa.model.FilmActorPK.class)
@javax.persistence.Table(name = "film_actor", schema = "", catalog = "sakila")
@Entity
public class FilmActor {
    private short actorId;
    private short filmId;
    private Timestamp lastUpdate;

所以我的问题是:

当我从演员中删除电影并合并该演员并检查数据库时,我发现一切都很好。假设演员 ID 为 5,电影 ID 为 3,我看到这些 id 已从 film_actor 表中删除。

问题是,在我的 JSF 项目中,尽管我的 bean 是请求范围的,并且它们应该获取新信息,但对于电影部分,它们没有。他们仍然给我带来了 id = 3 的 Actor 用于 id = 5 的电影。这是一个示例代码:

@RequestScoped
@Named
public class FilmTableBackingBean {

    @Inject
    FilmDao filmDao;

    List<Film> allFilms;

    public List<Film> getAllFilms(){
        if(allFilms == null || allFilms.isEmpty()){
            allFilms = filmDao.getAll();
        }
        return allFilms;
    }
}

如您所见,这是一个请求范围的 bean。每次我访问这个 bean 时,allFilms 最初都是空的。因此从数据库中获取新数据。但是,此获取的数据与数据库中的数据不匹配。它仍然带来了演员。

所以我猜这就像一个缓存问题。

有什么帮助吗?

编辑:只有在我重新启动服务器后,JPA 获取的信息才是正确的。

编辑:这也无济于事:

@Entity
public class Film {
    private short filmId;
    @ManyToMany(mappedBy = "films", fetch = FetchType.EAGER)
    public List<Actor> getActors(){
        return actors;
    }
4

2 回答 2

2

映射是错误的。

连接表被映射两次:一次作为多对多关联的连接表,一次作为实体。这是一个或另一个,但不是两者兼而有之。

多对多也是错误的。一侧必须是相反的一侧并使用该mappedBy属性(因此不定义连接表,该连接表已在关联的另一侧定义)。请参阅Hibernate 文档中的示例 7.24 及其前面的文本(也适用于其他 JPA 实现)

旁注:为什么要使用 ID 的缩写?Long 将是一个更明智的选择。

于 2013-07-20T09:05:18.853 回答
1

JB Nizet 是正确的,但您还需要维护双方的关系,因为 JPA 中有缓存。EntityManager 本身缓存托管实体,因此请确保您的 JSF 项目正在关闭并重新获取 EntityManager,如果它们是长期存在的,则清除它们或刷新可能已过时的实体。像 EclipseLink 这样的提供者也有二级缓存http://wiki.eclipse.org/EclipseLink/Examples/JPA/Caching

于 2013-07-20T12:41:57.360 回答