我试图与hibernate(使用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数据库中创建。所以,如果有人可以帮助我。
答案 0 :(得分:1)
您正在将字段和访问者用于映射注释。你不能这样做。在任何给定的类中,映射注释必须全部在getter上或全部在字段上。如果你试图混合它们,一些在吸气剂上,一些在田地上,Hibernate将选择吸气剂或字段而忽略另一个(我不确定它是否指定了如果你没有指定Hibernate如何选择)
每个课程中的@Id
注释都在getter上,并且使Hibernate使用基于getter的注释。将@Id
和@GeneratedValue
注释移动到每个类中的id
字段,或者为actor / film关系定义getter(和setter)并移动@ManyToMany
和对新getter的@JoinTable
注释。
通过字段上的注释,Hibernate将绕过您的getter / setter并直接访问实体内部字段。将它们放在吸气剂上,Hibernate会打电话给你的吸气剂和装置者。
答案 1 :(得分:0)
通过提供有关您的联接表的更多信息来帮助Hibernate 在你的电影实体
std::string::data()
在您的Actor实体中执行相同操作,但反向joinColumns和inverseJoinColumns
https://docs.jboss.org/hibernate/orm/5.0/manual/en-US/html/ch07.html#collections-bidirectional