2010-10-13 28 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可能会很有用。如果您拥有单个实体并根据其部署针对不同数据源存储,则后者可能会很有用。

相关问题