Hibernate JPA 没有在 ManyToMany 关联上创建连接表

Posted

技术标签:

【中文标题】Hibernate JPA 没有在 ManyToMany 关联上创建连接表【英文标题】:Hibernate JPA No join table created on ManyToMany association 【发布时间】:2016-09-09 19:46:06 【问题描述】:

我正在尝试与 hibernate(使用 JPA)建立多对多关联,但未创建我的关联表(在电影和演员之间)。

我的演员班:

@Entity
public class Actor 

    private Long id;
    private String firstname;
    private String lastname;
    private int age;

    public Actor();

    public Actor(String firstname, String lastname)
        this.firstname=firstname;
        this.lastname=lastname;
    

    @ManyToMany
    @JoinTable(name="actor_films", joinColumns=@JoinColumn(name="actor_id"), inverseJoinColumns=@JoinColumn(name="film_id"))
    private Set<Film> films=new HashSet<Film>();

    @Id
    @GeneratedValue
    public Long getId() 
        return id;
    

    public void setId(Long id) 
        this.id = id;
    

    public String getFirstname() 
        return firstname;
    

    public void setFirstname(String firstname) 
        this.firstname = firstname;
    

    public String getLastname() 
        return lastname;
    

    public void setLastname(String lastname) 
        this.lastname = lastname;
    

    public int getAge() 
        return age;
    

    public void setAge(int age) 
        this.age = age;
    

    public void addFilm(Film film)
        this.films.add(film);
    


我的电影课:

@Entity
public class Film 

    private Long id;
    private String title;
    @ManyToMany(mappedBy = "films")
    @JoinTable(name="actor_films", joinColumns=@JoinColumn(name="film_id"), inverseJoinColumns=@JoinColumn(name="actor_id"))
    private Set<Actor> actors=new HashSet<Actor>();


    public Film();
    public Film(String title)
        this.title=title;
    ;


    @Id
    @GeneratedValue
    public Long getId() 
        return id;
    

    public void setId(Long id) 
        this.id = id;
    

    public String getTitle() 
        return title;
    

    public void setTitle(String title) 
        this.title = title;
    


    public void addActor(Actor actor)
        this.actors.add(actor);
    




在我的主要方法中,我执行以下操作:

// begin transaction
Film film=new Film("DBZ");
Actor actor=new Actor("Bob","A");
em.persist(actor);
em.persist(film);
film.addActor(actor);
// do commit

除了关联表之外,所有表都是在我的 hsql 数据库中创建的。所以如果有人可以帮助我。

【问题讨论】:

【参考方案1】:

您正在为映射注释混合使用字段和访问器。你不能那样做。在任何给定的类中,映射注释必须全部在 getter 上或全部在字段上。如果您尝试混合使用它们,一些在 getter 上,一些在字段上,Hibernate 将选择 getter 或字段并忽略另一个(我不确定它是否指定了 Hibernate 如果您不指定则如何选择)。

每个类中的 @Id 注释都在一个 getter 上,这使得 Hibernate 使用基于 getter 的注释。将@Id@GeneratedValue 注释移动到每个类中的id 字段,或者为演员/电影关系定义一个getter(和setter)并将@ManyToMany@JoinTable 注释移动到新的getter .

通过字段上的注释,Hibernate 将绕过您的 getter/setter 并直接访问实体内部字段。将它们放在 getter 上,Hibernate 将调用您的 getter 和 setter。

【讨论】:

【参考方案2】:

通过提供有关您的连接表的更多信息来帮助 Hibernate。 在您的电影实体中

 @ManyToMany(mappedBy = "films")
 @JoinTable(name="actor_films", joinColumns=@JoinColumn(name="film_id"), inverseJoinColumns=@JoinColumn(name="actor_id"))  

在您的 Actor 实体中执行相同的操作,但反转 joinColumns 和 inverseJoinColumns

https://docs.jboss.org/hibernate/orm/5.0/manual/en-US/html/ch07.html#collections-bidirectional

【讨论】:

感谢您的回答,我尝试了您的解决方案,但没有任何改变。关联表仍未创建。

以上是关于Hibernate JPA 没有在 ManyToMany 关联上创建连接表的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate JPA 没有在 ManyToMany 关联上创建连接表

jpa是啥,和hibernate类似?

直接加入 JPA 或 HIBERNATE

Spring boot + Hibernate + JPA 没有可用的事务性 EntityManager

JPA/Hibernate:IN ?1 的集合参数导致“没有为参数 1 指定值”

Hibernate/JPA @OneToOne 返回空指针异常