真的不好意思,讲了这么久,还没有说JPA是什么呢,JPA是Java Persistence API的缩写
是JSR 220: Enterprise JavaBeans,Version 3.0规范的一部分,是J2EE4中Entity Bean的
继承者,是一个java开发的通用持久化规范Java Persistence API 1.0, 其实就是完全重新
定义了的Entity Bean规范。Java Persistence AP(JPA)吸取了Hiberante,JDO,TopLink等优
秀技术和框架,将这几年发展成熟起来的基于POJO模型的O/R Mapping技术标准化,成为在
J2EE和J2SE环境中通用的java持久化API。值得注意的是Java Persistence API并不是J2EE环境
专用,而是在java中的通用API。意味着我们可以在任何需要访问关系数据库的地方使用JPA,
甚至包括面应用。JPA也不要求一定在J2EE容器中才能运行,而是任何有JVM的环境都可以运用。
这就使得我们可以很容易的把JPA作为一个持久化组件自由的和各种容器/框架(EJB3容器, Spring等等)组合。
JPA最主要的是一个统一的persistence.xml配置文件,可以放到每一个jar的META-INF/目录下面,配置内容主要有
(以hibernate为例)
1、数据库连接的配置文件
2、数据库方言、连接URL、用户名、密码
3、ORM映射的列表(Class)
4、配置其它的Hibernate属性(其他的Provider属性)
5、cache
主要内容,详细内容请看hibernate的reference
xml 代码
- xml version="1.0" encoding="UTF-8"?>
- <persistence>
- <persistence-unit name="TestEntityManager" transaction-type="RESOURCE_LOCAL">
- <provider>org.hibernate.ejb.HibernatePersistence<!---->provider>
- <class>com.jl.sub1.mapping.Product<!---->class>
- <class>com.jl.sub1.mapping.ProductItem<!---->class>
-
- <properties>
- <property name="hibernate.dialect" value="org.hibernate.dialect.DB2Dialect" />
- <property name="hibernate.connection.driver_class" value="com.ibm.db2.jcc.DB2Driver" />
- <property name="hibernate.connection.password" value="db2admin" />
- <property name="hibernate.connection.url" value="jdbc:db2://10.1.1.10:50000/dbjl" />
- <property name="hibernate.connection.username" value="db2admin" />
- <property name="hibernate.ejb.autodetection" value="class" />
- <!---->properties>
- <!---->persistence-unit>
- <!---->persistence>
-
-
-
-
- <property name="kodo.ConnectionDriverName" value="..."/>
- <property name="kodo.ConnectionURL" value="..."/>
- <property name="kodo.ConnectionUserName" value="..."/>
- <property name="kodo.ConnectionPassword" value="..."/>
- <property name="kodo.Log" value="DefaultLevel=INFO, Runtime=DEBUG, Tool=INFO"/>
-
spring配置
xml 代码
- <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
- <property name="entityManagerName" value="TestEntityManager" />
- <property name="jpaProperties">
- <props></props>
- </property>
-
- </bean>
-
-
-
- <bean class=
- "org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
-
-
-
- <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
- <property name="entityManagerFactory“ ref="entityManagerFactory" />
-
- </bean>
-
- <bean id="transactionInterceptor"
- class="org.springframework.transaction.interceptor.TransactionInterceptor">
- <property name="transactionManager" ref="transactionManager" />
- <property name="transactionAttributeSource">
- <bean class=
- "org.springframework.transaction.annotation.AnnotationTransactionAttributeSource" />
- </property>
- </bean>
-
- <bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
- <property name="transactionInterceptor" ref="transactionInterceptor" />
- </bean>
-
-
- <bean id="numberDao" class="dao.JpaNumberDAO">
- <property name="entityManagerFactory“ ref="entityManagerFactory" />
- </bean>
-
-
这样就好了,可以使用entitymanager,每个jar里面可以相互不用影响,而且这个也符合我们新过程改进推进的每个子系统用jar发布的原则,当然这里的还有作service层,对于子系统之间的交互,我觉得,原则上应该仅允许他们在service的层面上进行,在DAO之间不应该有相互的交叉,不过隐约觉
得还有很多东西要做,嗯,很晚了,肚子饿,明天再想,呵呵
哦,对了,Spring真是好东西,封装了这么多东西给我们用,真是期待更好的版本出来啊,
还有,在j2se环境里,也可以通过代码的方式取得JPA的api
java 代码
- EntityManagerFactory emf =
- Peristence.createEntityManagerFactory(“TestEntityManager”) ;
-
-
-
-
-
- EntityManager em = emf.createEntityManager();
- ...
- em.close();
- ...
- emf.close();
- EntityManagerFactory emf =
- Peristence.createEntityManagerFactory(“TestEntityManager”) ;
- EntityManager em = emf.createEntityManager();
- ...
- em.close();
- ...
- emf.close();