2011-03-23 47 views
0

我有以下類映射爲一對多:讀者和書籍,當一個讀者可以容納一個以上的書:休眠選擇一對多幫助

書:

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

    private static final long serialVersionUID = 1L; 

    private Long id; 
    private String author; 
    private String title; 

    public Book(){} 
    public Book(String author,String title){ 
     this.author = author; 
     this.title = title; 
    } 

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

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

    @Column(name = "author") 
    public String getAuthor() { 
     return author; 
    } 
    public void setAuthor(String author) { 
     this.author = author; 
    } 

    @Column(name="title") 
    public String getTitle() { 
     return title; 
    } 
    public void setTitle(String title) { 
     this.title = title; 
    } 
    //equals and hashcode ommited. 
} 

讀者

@Entity 
@Table(name = "reader") 
public class Reader implements Serializable{ 

    private static final long serialVersionUID = 1L; 

    private Long id; 
    private String firstName; 
    private String lastName; 
    Set<Book> set = new HashSet<Book>(); 

    @Transient 
    public void loanBook(Book book){ 
     set.add(book); 
    } 

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

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

    @Column(name="firstName") 
    public String getFirstName() { 
     return firstName; 
    } 


    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 


    @Column(name="lastName") 
    public String getLastName() { 
     return lastName; 
    } 


    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    @OneToMany(cascade=CascadeType.ALL,fetch = FetchType.LAZY) 
    @JoinColumn(name="READER_ID") 
    public Set<Book> getSet() { 
     return set; 
    } 


    public void setSet(Set<Book> set) { 
     this.set = set; 
    } 

    public Reader(){} 

    public Reader(String firstName, String lastName){ 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 
} 

現在我想用一些書籍ID取讀卡器類,例如:

Reader reader = service.getReaderbyBook(Long.valueOf(10)); 

我的功能看起來像:

@Override 
    public Reader getReaderbyBook(Long id) { 
     Session session = null; 
     Reader reader = null; 
     session =sessionFactory.openSession(); 
      org.hibernate.Transaction tr = session.getTransaction(); 
      tr.begin(); 
      String hqlSelect = "Select .... where book.id:=id"; 
      Query query = session.createQuery(hqlSelect); 
      query.setLong("id", id); 
      reader = (Reader) query.uniqueResult(); 
      tr.commit(); 
      session.flush(); 
       session.close(); 
       return reader; 
    } 

} 

如何我的HQL選擇應該是這樣,如果我只是想獲取一些書相關的單一閱讀器?

回答

3

from Reader r join r.set book where book.id = :id

-2

我認爲你應該創建一張表來將讀者映射到書本上。 它使事情變得更容易。

+2

它的一對多 - 如何創建額外的表幫助? – Nilesh 2011-03-23 08:26:34

+0

@Nilesh:讓我們假設你有一張表,主鍵爲reader_id的讀者,然後你有主表book_id的表書...現在添加另一個名爲Issued_books_by_readers,併爲讀者添加reader_id和book_id。請記住,一旦圖書被退回,請將其保存在歷史記錄表中,並刪除表格中的記錄。這是我認爲你可以在數據庫級別 – Amanpreet 2011-04-14 12:06:02

+1

中處理1到多個這就是多對多! – Nilesh 2011-04-14 13:10:25