JPA @OneToMany映射问题

时间:2011-07-20 02:10:33

标签: jpa hibernate-mapping

我正在尝试做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)

感谢。

1 个答案:

答案 0 :(得分:2)

使用@OneToMany注释似乎是一种误解。 @OneToMany注释用于表示1:M关系中的1侧,而反@ManyToOne注释用于表示M侧。因此,应在实体中的集合类型上定义@OneToMany注释,而不是在普通引用类型上。

因此,您应该:

  • 如果这是实体之间关系的性质,则使用@OneToOne关联。
  • 或者,决定哪个实体代表1:M关系中的1面。通过使用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可能无法映射列,或者可能无法从数据库中检索关联的记录;我不确定运行时行为的细节,除了我知道最终失败。