繁体   English   中英

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

[英]Hibernate JPA No join table created on ManyToMany association

我正在尝试与休眠(与JPA)建立多对多关联,但未创建我的关联表(在Film和Actor之间)。

我的演员班:

@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数据库中创建。 因此,如果有人可以帮助我。

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

每个类中的@Id注释都在getter上,这使Hibernate使用基于getter的注释。 @Id@GeneratedValue批注移动到每个类的id字段中,或者为演员/电影关系定义一个吸气剂(和设置器),然后将@ManyToMany@JoinTable批注移动到新的吸气剂。

使用字段上的注释,Hibernate将绕过您的getter / setter方法并直接访问实体内部字段。 将它们放置在吸气剂上后,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/zh-CN/html/ch07.html#collections-bidirectional

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM