Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA@OneToMany映射问题_Jpa_Hibernate Mapping - Fatal编程技术网

JPA@OneToMany映射问题

JPA@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

我正试图进行JPA/Hibernate映射以映射两个表,但遇到了这个错误。任何帮助都将不胜感激

餐厅.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;}
@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 <代码> >关系。改进后的代码将是:
餐厅.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;}
@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 <代码> >关系。改进后的代码将是:
餐厅.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;}
@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可能无法映射列,或者无法从数据库检索相关记录;我不确定运行时行为的细节,但我知道最终的失败