2012-01-15 10 views
12

BookStockとBookの2つのテーブルの間に1対多のマッピングを行いたいですが、次のようになります例外Hibernateマッピング例外:カラムの型を決定できませんでした:[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)] 

bookStockエンティティは

@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; 
    } 
} 

ブックエンティティが

@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; 
    } 
} 

例クラス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(); 
    } 
} 

この関係で何が問題になっていますか?

答えて

42

フィールドとメソッドの両方に注釈を付けるので、すべての注釈が見つかりません。戦略は1つだけ使用する必要があります。あなたのケースでは、ID の@注釈欄が最初に見られ、get-methodsの注釈が効果を発揮しないのはなぜですか。その結果、ハイバネーションは正しく仮定します。

はマッピングされていません。アノテーションをid-fieldからgetId-method(両方のエンティティ)に移動すると、問題は解決されます。

マッピングに関するその他の問題の修正については、下記のコメントを参照してください。

+3

良いキャッチです。さらに、マッピングは完全に間違っています。 PrimaryKeyJoinColumnは意味をなさないが、その関連付けは双方向ですが、片側にmappedBy属性はありません。 http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#collections-bidirectionalを参照してください。 –

関連する問題