2010-10-13 83 views
2

假設我有一個Java或C#應用程序,其中我有Book,Library,Author等類,我想要一個簡單的方法將這些項目映射到數據庫,或者將它們顯示在數據網格中。Java或.Net應用程序嚴重依賴於反射嗎?

我可以實現對所有這些類專門針對數據網格和數據庫的交互接口,但是這可能意味着相當長的一段工作時:

  • 一個新的類被添加(如貸款人,出版商,。 ..)
  • 添加一個新的通用模塊(例如,其中用戶可以選擇在報告中顯示哪些類的信息的報告模塊)

另一種方法是依靠反射能力Java和C#和簡單的你選擇這些信息來構建數據網格和數據庫接口。這是一種合乎邏輯的方法,還是最好不要依賴反射,併爲每個類模塊組合(書 - 數據網格,書籍數據庫,書籍報告,圖書館 - 數據網格,圖書館 - 數據庫,圖書館報告,作者-datagrid,...)?

對於數據庫映射,可以使用像Hibernate這樣的工具,但Hibernate是否也依賴於反射,或者是否必須爲每個類實現顯式接口以及如何使用Hibernate?

+1

請不要提問像這個社區維基。 – 2010-10-13 08:11:10

+1

@seanizer:社區wiki有沒有問題?這個問題似乎接近分界線。 – Douglas 2010-10-13 08:14:16

+0

由於這只是一個問題,想知道如何實現這些東西(所以我知道如何在我自己的應用程序中「合理地」執行某些操作),而不是明確的問題和明確的答案,因此我將此作爲一個社區Wiki問題。如果對這個問題的提出存在疑問,那麼一般規則是什麼? – Patrick 2010-10-13 08:32:05

回答

1

這是一個不錯的article解決一些問題。 Hibernate確實使用了運行時反射,但有時您必須稍微調整一下。持久性問題的全自動化還沒有完成。反思的一大優點是人爲錯誤的可能性較低。

1

是的,NHibernate大量使用反射。對於渲染網格,請查看WPF中的數據模板,因爲您將能夠根據列中顯示的數據類型控制不同單元格的渲染。

1

如果您要將數據映射到數據庫,那麼您可能需要研究Java持久性體系結構(JPA)標準。類使用定義表字段,關係等的標籤進行註釋,而不會實質性地影響對那些東西不感興趣的代碼如何與類進行交互。換句話說,這是一個POJO。

JPA的實現,如Hibernate & OpenJPA使用註釋從數據源加載/存儲實體,該數據源通常是SQL數據庫,但嚴格來說不一定非要。

存儲在數據庫中的類將被註釋爲@Entity,並且包含可能是持久性或瞬態的字段。您還可以指定@Column字段映射到數據庫中,並使用@OneToOne@ManyToOne@OneToMany註釋與@JoinTable,@JoinColumn來定義權利之間的關係。

實體通過EntityManager和查詢語言進行存儲/檢索。

例如

@Entity 
@Table(name = "BOOKS") 
class Book { 
    @Id 
    @Column(name = "BOOK_ID") 
    int bookId; 

    @ManyToOne 
    @JoinColumn(name = "AUTHOR_ID", insertable = false, updatable = false) 
    Author author; 

    @Column(name = "TITLE") 
    String title; 

    @Transient 
    double relevanceScore; 
} 

@Entity 
@Table(name = "AUTHORS") 
class Author { 
    @Id 
    @Column(name = "AUTHOR_ID") 
    int id; 

    @Column(name = "NAME") 
    String name; 

    @OneToMany(mappedBy = "AUTHORS") 
    @JoinColumn(name = "AUTHOR_ID") 
    Set<Book> books; 
} 

,並利用它:

Query q = getEntityManager.createQuery("SELECT b FROM Book b WHERE b.title = :title"); 
q.setParameter("title", title); 
return q.getResultList(); 

在Hibernate中的情況下,你可以選擇是否使用JPA風格批註或外部XML映射文件。在大多數情況下,註釋可能更易於維護,但如果您想在運行時使用映射而不重建源代碼,則XML可能會很有用。如果您擁有單個實體並根據其部署針對不同數據源存儲,則後者可能會很有用。