2012-01-15 26 views
12

Tôi muốn thực hiện ánh xạ một-nhiều giữa hai bảng BookStock và Sách, nhưng tôi nhận được thông tin sau ngoại lệNgoại lệ lập bản đồ Hibernate: Không thể xác định loại cho cột: [org.hibernate.mapping.Column]

Exception in thread "main" org.hibernate.MappingException: Could not determine type for: java.util.List, at table: book_stock, for columns: [org.hibernate.mapping.Column(books)] 

thực thể bookStock là

@Entity 
@Table(name = "book_stock") 
public class BookStock { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    private Long stock; 
    private List<Book> books; 

    @Column(name = "id") 
    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @Column(name = "stock") 
    public Long getStock() { 
     return stock; 
    } 

    public void setStock(Long stock) { 
     this.stock = stock; 
    } 

    @OneToMany 
    @PrimaryKeyJoinColumn 
    public List<Book> getBooks() { 
     return books; 
    } 

    public void setBooks(List<Book> books) { 
     this.books = books; 
    } 
} 

Sách Entity là

@Entity 
@Table(name = "book") 
public class Book { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 
    private String bookName; 
    private BigDecimal price; 
    private BookStock bookStock; 

    @Column(name = "id") 
    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @Column(name = "book_name") 
    public String getBookName() { 
     return bookName; 
    } 

    public void setBookName(String bookName) { 
     this.bookName = bookName; 
    } 

    @Column(name = "price") 
    public BigDecimal getPrice() { 
     return price; 
    } 

    public void setPrice(BigDecimal price) { 
     this.price = price; 
    } 

    @ManyToOne 
    public BookStock getBookStock() { 
     return bookStock; 
    } 

    public void setBookStock(BookStock bookStock) { 
     this.bookStock = bookStock; 
    } 
} 

Các Ví dụ lớp tôi s

public class transactionsExample { 

    public static void main(String[] args) { 
     AnnotationConfiguration configuration = new AnnotationConfiguration(); 
     configuration.configure(); 
     configuration.addAnnotatedClass(Book.class); 
     configuration.addAnnotatedClass(BookStock.class); 
     configuration.setNamingStrategy(ImprovedNamingStrategy.INSTANCE); 
     SessionFactory sessionFactory = configuration.buildSessionFactory(); 
     Session session = sessionFactory.openSession(); 

     session.beginTransaction(); 
     Book book1 = EntityBuilder.book().withISBN("21234").withName("Anario").withPrice(25.90).purchase(); 
     session.save(book1); 
     session.getTransaction().commit(); 
    } 
} 

Có gì sai trong mối quan hệ này?

Trả lời

42

Nó không tìm thấy tất cả chú thích của bạn, bởi vì bạn đang chú thích cả trường và phương thức. Bạn phải sử dụng chỉ một chiến lược. Trong trường hợp của bạn chú thích @Id trong trường id được xem trước tiên và đó là lý do tại sao chú thích trong get-method không có hiệu lực. Do kết quả hibernate giả định chính xác rằng

List<Book> books; 

không được ánh xạ. Nếu bạn di chuyển các chú thích từ trường id sang phương thức getId (cho cả hai thực thể), thì vấn đề sẽ được giải quyết.

Về cách khắc phục các sự cố khác với ánh xạ, vui lòng xem nhận xét bên dưới.

+3

Bắt tốt. Hơn nữa, ánh xạ hoàn toàn sai. PrimaryKeyJoinColumn không có ý nghĩa và liên kết là hai chiều, nhưng một bên không có thuộc tính mappedBy. Xem http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#collections-bidirectional –

Các vấn đề liên quan