JPA @OneToMany Mapping Problem - PullRequest
       12

JPA @OneToMany Mapping Problem

0 голосов
/ 20 июля 2011

Я пытаюсь выполнить сопоставления 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, atтаблица: MENUS, для столбцов: [org.hibernate.mapping.Column (restaurant)] в 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) на bb.TestMain.main (TestMain.java:59)

Спасибо.

1 Ответ

2 голосов
/ 20 июля 2011

Представляется неправильным представление об использовании аннотации @OneToMany. Аннотация @OneToMany используется для представления стороны 1 в отношении 1: M, а обратное отношение @ManyToOne используется для представления стороны M. Следовательно, аннотация @OneToMany должна быть определена для типа коллекции в сущности, а не для обычного ссылочного типа.

Поэтому вы должны:

  • используйте ассоциацию @OneToOne, если такова природа отношений между сущностями.
  • или решите, какой объект представляет 1-сторону в отношении 1: M. Исходя из использования класса LinkedList в Restaurants, я бы считал класс Restaurants односторонним и использовал аннотацию @OneToMany в классе Restaurants, а обратный @ManyToOne отношения в классе Menus. Уточненный код будет:

Restaurants.java

...
@OneToMany(mappedBy="restaurant")
private List<Menus> menus = new LinkedList<Menus>();

Menus.java

@ManyToOne
@JoinColumn(name="restaurant")
private Restaurants restaurant;

Обратите внимание на изменение в объявлении переменной-члена menus с LinkedList<Menus> до List<Menus>. По-видимому, в этом случае разумнее объявить любую коллекцию с типом интерфейса коллекции, а не с конкретным классом коллекции. Обоснование заключается в том, что основной поставщик JPA будет использовать свои конкретные типы коллекций во время выполнения с целью передачи значений коллекции. Например, Hibernate будет использовать PeristentList во время выполнения для представления списка в управляемом объекте, а не LinkedList, созданный объектом. Если вы используете конкретный тип, Hibernate может не отображаться в столбце или может не получить соответствующие записи из базы данных; Я не уверен в особенностях поведения во время выполнения, за исключением того, что я знаю о возможном сбое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...