JPA@OneToMany映射问题
我正试图进行JPA/Hibernate映射以映射两个表,但遇到了这个错误。任何帮助都将不胜感激 餐厅.javaJPA@OneToMany映射问题,jpa,hibernate-mapping,Jpa,Hibernate Mapping,我正试图进行JPA/Hibernate映射以映射两个表,但遇到了这个错误。任何帮助都将不胜感激 餐厅.java @Entity @Table(name="RESTAURANTS") public class Restaurants{ @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; @OneToMany(mappedBy="restaurant") private Li
@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;}
@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;}
}
...
@OneToMany(mappedBy="restaurant")
private List<Menus> menus = new LinkedList<Menus>();
@ManyToOne
@JoinColumn(name="restaurant")
private Restaurants restaurant;
出现此错误
线程“main”org.hibernate.MappingException中的异常:无法
确定类型:bb.entities.Restaurants,在表中:菜单,用于
栏目:[org.hibernate.mapping.Column(餐厅)]位于
org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:306)位于
org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:290)位于
org.hibernate.mapping.Property.isValid(Property.java:217)位于
org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:464)
位于org.hibernate.mapping.RootClass.validate(RootClass.java:235)
org.hibernate.cfg.Configuration.validate(Configuration.java:1362)位于
org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1865)
在bb.TestMain.setUp(TestMain.java:26)中
TestMain.main(TestMain.java:59)
谢谢。使用注释时似乎存在误解。
@OneToMany
注释用于表示1:M关系中的1侧,反向@ManyToOne
关系用于表示M侧。因此,@OneToMany
注释应该在实体中的集合类型上定义,而不是在普通引用类型上定义
因此,你应该:
- 如果这是实体之间关系的性质,则使用关联
- 或者,决定哪个实体代表1:M关系中的1边。在代码<餐馆> <代码>中使用“代码> > LIKEDLIST/<代码>类,在代码< >菜单> <代码>类中,在代码< >餐馆< /代码>类中,使用< <代码> @ OneToMany >代码>注释,使用< <代码> > MyytoOne <代码> >关系。改进后的代码将是:
@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;}
@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;}
}
...
@OneToMany(mappedBy="restaurant")
private List<Menus> menus = new LinkedList<Menus>();
@ManyToOne
@JoinColumn(name="restaurant")
private Restaurants restaurant;
注意
菜单
成员变量的声明从链接列表
更改为列表
。显然,在这种情况下,更明智的做法是使用集合的接口类型声明任何集合,而不是使用具体的集合类。基本原理是,为了代理集合值,底层JPA提供程序将在运行时使用自己的具体集合类型。例如,Hibernate将在运行时使用来表示托管实体中的列表,而不是实体创建的LinkedList
。如果使用具体类型,Hibernate可能无法映射列,或者无法从数据库检索相关记录;我不确定运行时行为的细节,但我知道最终会失败。这似乎是使用注释时的一个误解。@OneToMany
注释用于表示1:M关系中的1侧,反向@ManyToOne
关系用于表示M侧。因此,@OneToMany
注释应该在实体中的集合类型上定义,而不是在普通引用类型上定义
因此,你应该:
- 如果这是实体之间关系的性质,则使用关联
- 或者,决定哪个实体代表1:M关系中的1边。在代码<餐馆> <代码>中使用“代码> > LIKEDLIST/<代码>类,在代码< >菜单> <代码>类中,在代码< >餐馆< /代码>类中,使用< <代码> @ OneToMany >代码>注释,使用< <代码> > MyytoOne <代码> >关系。改进后的代码将是:
@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;}
@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;}
}
...
@OneToMany(mappedBy="restaurant")
private List<Menus> menus = new LinkedList<Menus>();
@ManyToOne
@JoinColumn(name="restaurant")
private Restaurants restaurant;
注意菜单
成员变量的声明从链接列表
更改为列表
。显然,在这种情况下,更明智的做法是使用集合的接口类型声明任何集合,而不是使用具体的集合类。基本原理是,为了代理集合值,底层JPA提供程序将在运行时使用自己的具体集合类型。例如,Hibernate将在运行时使用来表示托管实体中的列表,而不是实体创建的LinkedList
。如果使用具体类型,Hibernate可能无法映射列,或者无法从数据库检索相关记录;我不确定运行时行为的细节,但我知道最终的失败