2012-01-15 10 views
12

मैं दो टेबल बुकस्टॉक और बुक के बीच एक-से-कई मैपिंग करना चाहता हूं, लेकिन मुझे निम्नलिखित मिल रहा है अपवादहाइबरनेट मैपिंग अपवाद: कॉलम के लिए प्रकार निर्धारित नहीं कर सका: [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; 
    } 
} 

उदाहरण वर्ग मैं है एस

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

यह आपकी सभी टिप्पणियां नहीं ढूंढता है, क्योंकि आप दोनों फ़ील्ड और विधियों को एनोटेट कर रहे हैं। आपको केवल एक रणनीति का उपयोग करना होगा। आईडी फ़ील्ड में आपके मामले में @ आईडी एनोटेशन पहले देखा जाता है और यही कारण है कि गेट-विधियों में एनोटेशन प्रभाव नहीं पड़ता है। नतीजतन हाइबरनेट सही ढंग से मानता है कि

List<Book> books; 

मैप नहीं किया गया है। यदि आप id-field से getId-method (दोनों इकाइयों के लिए) में एनोटेशन भी ले जाते हैं, तो समस्या हल हो जाती है।

मैपिंग के साथ अन्य मुद्दों को ठीक करने के बारे में, कृपया नीचे टिप्पणी देखें।

+3

अच्छी पकड़। इसके अलावा, मैपिंग पूरी तरह से गलत है। PrimaryKeyJoinColumn समझ में नहीं आता है, और एसोसिएशन द्विपक्षीय है, लेकिन एक तरफ कोई मैप नहीं है। Http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#collections-bidirectional देखें –

संबंधित मुद्दे