THE MOMENT, THE MEMENTO

2007年11月28日

关于数据持久化的概念

标签:, , — 吴德文 @ 00:39

自从接触J2EE以来,就不停的接受到持久化(Persistence)的概念。虽然不明白这是什么意思,但是为了快速阅读到后面一些实际编程的技术,都是跳过这个概念,假定这是一个数据封装,从业务逻辑那里将数据库源底层操作分离开的技术。

到了现在读JPA的时候,跳不过去了。例如下面的代码:


public void persistAnimal(Animal animal) {
 // 获取EntityManagerFactory
 EntityManagerFactory factory = Persistence
  .createEntityManagerFactory("mysql");
 // 获取EntityManager
 EntityManager em = factory.createEntityManager();
 // 开始事务处理
 em.getTransaction().begin();
// 持久化对象
 em.persist(animal)
// 提交事务
 em.getTransaction().commit();
 // 关闭EntityManager
 em.close();
 // 关闭EntityManagerFactory
 factory.close();
}

专门有一个函数persist来持久化对象。最开始我认为持久化是业务层能够持久使用数据库的数据,为了不频繁读数据库,将数据库的内容以对象的形式放到内存来,并且对象发生变化的时候会同步到数据库去。即我的理解是把数据库持久化为对象,是数据库->对象。

但是这个理解很牵强,很难理解上面的代码,为什么是对一个对象进行持久化的操作。决定还是把持久化的概念搞明白。Google之。

看了Javen-Studio 咖啡小屋学习笔记之什么是持久化和对象关系映射ORM技术之后,才发现原来持久化是把业务数据对象持久化到存储设备上去。我之前的理解完全是南辕北辙,怪不得到了真正代码的时候就理解不过去了。

何谓”持久化”
持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。

也只有主体是数据对象,才好真正去理解持久化。从序列化(我一直以为是让数据库序列化输出,然而实际上是将对象转化为字节流,通过网络传输或者保存在文件中)到数据库都好理解了。都是将内存里的数据(对象)转储成各种形式的存储结构。在JPA里也就是为什么新建对象后都要执行持久化的函数,其实就相当于一个数据库Insert操作,因为新建的对象如果没有持久化的话,是不会和数据库建立关联联系起来的;而其他从数据库读取出来产生的对象,是有联系的。


Related:

2007年11月27日

终于写出一个基于JPA的程序了

标签:, , , — 吴德文 @ 16:11

发现自己学东西实在太慢了,常常一个月都在读文档,却始终写不出一个有用的东西来。

之前开始学JPA——本来是按照一些PPT和书上的内容学EJB的,当然有也讲Hibernate的书,可是EJB还没有看完呢,也没有空看。后来才发现EJB(2.0)过时了,找了最新的技术,觉得JPA应该是以后的趋势了,就学它了,可是断断续续的这么久,不断的测试平台,也才只是学会怎么将数据库映射成对象(其实很简单,就只是一个JPA Tool->Generate Entities就搞定的事情),下午终于下定决心搞出一个可以连上数据库查询出东西来的sample程序。

经过给persistence.xml添加Properties(openjpa.ConnectURL等),添加Postgresql驱动(这里要说的是驱动URI是org.postgresql.Driver,开始设成了org.postgresql.jdbc.Driver,结果一直出错(org.apache.openjpa.util.StoreException ),还有一个数据库设置的问题,另外其一个题来说吧。附加上主程序吧,实在是简单呢。

EntityManagerFactory factory = Persistence.createEntityManagerFactory("Dali-ME");
// 从 EntityManagerFactory 实例 factory 中获取 EntityManager
EntityManager em = factory.createEntityManager();
Basic basic = em.find(Basic.class, 4);System.out.println("ID: " + basic.getUid());
System.out.println("姓名: " + basic.getXingming());
System.out.println("学号: " + basic.getXuehao());
System.out.println("性别: " + basic.getGender());
em.close ();
factory.close ();


Related:

Valid XHTML 1.1 Valid CSS! Creative Commons License WordPress 所驱动