java - Hibernate JPA 未在 ManyToMany 关联上创建连接表

标签 java hibernate jpa hsqldb

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

我的 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 将选择 getter 或字段并忽略其他(如果你不指定,我不确定它是否指定了 Hibernate 如何选择)。

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

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

关于java - Hibernate JPA 未在 ManyToMany 关联上创建连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39418764/

相关文章:

java - 使用数据表与单独的审计表进行审计

java - 涂抹工具的算法?

java - JAX-RS:从 post() 响应中检索属性

java - 计算java中字符串中1's,0' s,2的数量

java - Hibernate/JPA - 注释 bean 方法和字段

hibernate - 实体bean的Guice依赖注入(inject)?

java - 在 SurfaceView 之上添加布局

hibernate - Hibernate HQL:两个级别的联接

mysql - Hibernate createSQLQuery - 它如何验证 SQL?

java - 复制具有关联角色的新用户