假设我有一个Java或C#应用程序,其中我有类,如Book,Library,Author,...我想要一种简单的方法将这些项映射到数据库,或者在数据网格中显示它们。
我可以专门为数据网格和数据库交互实现所有这些类的接口,但这可能意味着在以下情况下有一些工作:
另一种方法是依靠Java和C#的反射功能,并简单地使用此信息来构建数据网格和数据库接口。这是一种逻辑方法还是最好不依赖于反射并为每个类模块组合编写显式接口(book-datagrid,book-database,book-report,library-datagrid,library-database,library-report,author -datagrid,...)?
对于数据库映射,可以使用像Hibernate这样的工具,但Hibernate是否也依赖于反射,或者您是否必须为每个类实现一个显式接口以及使用Hibernate?
答案 0 :(得分:1)
是的,NHibernate大量使用反射。对于渲染网格,请查看WPF中的数据模板,因为您可以根据列中显示的数据类型控制不同单元格的渲染。
答案 1 :(得分:1)
这是一个很好的article解决了一些问题。 Hibernate确实使用了运行时反射,但有时你需要稍微调整一下。还没有完全自动化持久性问题。反思的一大优势是人为错误的可能性较低。
答案 2 :(得分:1)
如果要将数据映射到数据库,则可能需要研究Java持久性体系结构(JPA)标准。类使用标记进行注释,这些标记定义表字段,关系等,而不会实质上影响对该内容不感兴趣的代码如何与类交互。换句话说,这是一个POJO。
JPA实现,例如Hibernate& OpenJPA使用注释从数据源加载/存储实体,数据源通常是SQL数据库,但严格来说不一定是。
存储在数据库中的类注释为@Entity
,并包含可能是持久的或瞬态的字段。您还可以将字段映射的@Column指定到数据库中,并使用@OneToOne
,@ManyToOne
和@OneToMany
注释与@JoinTable
,@JoinColumn
来定义之间的关系授权。
通过EntityManager
和查询语言存储/检索实体。
e.g。
@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可能很有用。如果您有一个实体并且根据部署它存储在不同的数据源中,后者可能会很有用。