2016-09-09 3 views
0

Я пытаюсь создать много-много ассоциаций с hibernate (с JPA), но моя таблица связей (между фильмом и актером) не создается.Hibernate JPA Не создана таблица соединений, созданная в ассоциации ManyToMany

Мой класс актер:

@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", [email protected](name="actor_id"), [email protected](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", [email protected](name="film_id"), [email protected](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

Вы смесительные поле и аксессу использовать для отображения аннотаций. Вы не можете этого сделать. В любом заданном классе аннотации отображения должны быть либо на геттерах, либо на всех полях. Если вы попытаетесь их смешивать, некоторые из получателей и некоторые из полей, Hibernate будет выбирать геттеры или поля и игнорировать другие (я не уверен, если он указан, как Hibernate выбирает, если вы не укажете).

Аннотации @Id в каждом классе находятся на геттере, и это делает Hibernate использовать аннотации на основе getter. Перемещайте аннотации и @GeneratedValue в поле id в каждом классе или определите геттер (и сеттер) для отношения актера/пленки и переместите аннотации к новому геттеру.

С аннотациями на полях Hibernate будет обходить ваши получатели/сеттеры и напрямую обращаться к внутренним полям объекта. С ними на геттерах, Hibernate назовет ваших геттеров и сеттеров.

0

Помогите спящий режим, предоставив ему более подробную информацию о вашей таблице соединений.
в вашем фильме лица

@ManyToMany(mappedBy = "films") 
@JoinTable(name="actor_films", [email protected](name="film_id"), [email protected](name="actor_id")) 

Сделайте то же самое в вашем Actor лица, но обратный joinColumns и inverseJoinColumns

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

+0

Спасибо за ваш ответ, я попробую ваше решение, но никаких изменений. Стол ассоциации еще не создан. –

Смежные вопросы