我正在尝试做JPA / Hibernate映射来映射两个表,但是我收到了这个错误。任何帮助将不胜感激!!
Restaurants.java
@Entity
@Table(name="RESTAURANTS")
public class Restaurants{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@OneToMany(mappedBy="restaurant")
private LinkedList<Menus> menus = new LinkedList<Menus>();
/* constructors **/
public Restaurants(){
this.dateJoined = new Date();
};
/* getters and setters **/
@Id
@GeneratedValue(generator="increment")
@GenericGenerator(name="increment", strategy = "increment")
public Long getId() {return id;}
public void setId(Long id) {this.id = id;}
public LinkedList<Menus> getMenus() {return menus;}
public void setMenus(LinkedList<Menus> menus) {this.menus = menus;}
}
Menus.java
@Entity
@Table(name = "MENUS")
public class Menus {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private Long restaurantID;
@OneToMany
@JoinColumn(name="restaurant")
private Restaurants restaurant;
/* constructors */
public Menus(){}
/* getters and setters */
@Id
@GeneratedValue(generator="increment")
@GenericGenerator(name="increment", strategy = "increment")
@Column(nullable = false)
public Long getId() {return id;}
public void setId(Long id) {this.id = id;}
public Long getRestaurantID() {return restaurantID;}
public void setRestaurantID(Long restaurantID) {this.restaurantID = restaurantID;}
public void setRestaurant(Restaurants restaurant) {this.restaurant = restaurant;}
public Restaurants getRestaurant() {return restaurant;}
}
出现此错误
线程“main”中的异常org.hibernate.MappingException:不能 确定类型:bb.entities.Restaurants,在表:MENUS,for 专栏:[org.hibernate.mapping.Column(restaurant)] at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:306)at at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:290)at at org.hibernate.mapping.Property.isValid(Property.java:217)at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:464) 在org.hibernate.mapping.RootClass.validate(RootClass.java:235)at at org.hibernate.cfg.Configuration.validate(Configuration.java:1362)at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1865) 在bb.TestMain.setUp(TestMain.java:26)at bb.TestMain.main(TestMain.java:59)
感谢。
答案 0 :(得分:2)
使用@OneToMany
注释似乎是一种误解。 @OneToMany
注释用于表示1:M关系中的1侧,而反@ManyToOne
注释用于表示M侧。因此,应在实体中的集合类型上定义@OneToMany
注释,而不是在普通引用类型上。
因此,您应该:
@OneToOne
关联。LinkedList
中的Restaurants
类,我会将Restaurants
类视为1方,并在{{1}中使用@OneToMany
注释在Restaurants
类中使用反@ManyToOne
关系时。精炼的代码将是:<强> Restaurants.java 强>
Menus
<强> Menus.java 强>
...
@OneToMany(mappedBy="restaurant")
private List<Menus> menus = new LinkedList<Menus>();
请注意@ManyToOne
@JoinColumn(name="restaurant")
private Restaurants restaurant;
成员变量声明从menus
更改为LinkedList<Menus>
。显然,在这种情况下,使用集合的接口类型而不是具体的集合类声明任何集合是明智的。基本原理是底层JPA提供程序将在运行时使用它自己的具体集合类型,以便代理集合值。例如,Hibernate将在运行时使用PeristentList
来表示托管实体中的List,而不是实体创建的List<Menus>
。如果使用具体类型,Hibernate可能无法映射列,或者可能无法从数据库中检索关联的记录;我不确定运行时行为的细节,除了我知道最终失败。