openJPA从数据库生成代码操作

来源:互联网 发布:mac清理微信缓存 编辑:程序博客网 时间:2024/06/03 23:16

一、新建一个普通的Java项目(不是WTP项目)


 

二、转换为Maven项目

 

增加一些库依赖,pom.xml代码如下:

Xml代码  收藏代码
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  2.   <modelVersion>4.0.0</modelVersion>  
  3.   <groupId>StrongOpenJPA</groupId>  
  4.   <artifactId>StrongOpenJPA</artifactId>  
  5.   <version>0.0.1-SNAPSHOT</version>  
  6.   <dependencies>  
  7.     <dependency>  
  8.       <groupId>org.slf4j</groupId>  
  9.       <artifactId>slf4j-api</artifactId>  
  10.       <version>1.6.4</version>  
  11.     </dependency>  
  12.     <dependency>  
  13.       <groupId>org.slf4j</groupId>  
  14.       <artifactId>slf4j-log4j12</artifactId>  
  15.       <version>1.6.4</version>  
  16.     </dependency>  
  17.     <dependency>  
  18.       <groupId>org.springframework</groupId>  
  19.       <artifactId>spring-aop</artifactId>  
  20.       <version>3.1.1.RELEASE</version>  
  21.     </dependency>  
  22.     <dependency>  
  23.       <groupId>org.springframework</groupId>  
  24.       <artifactId>spring-context</artifactId>  
  25.       <version>3.1.1.RELEASE</version>  
  26.     </dependency>  
  27.     <dependency>  
  28.       <groupId>org.springframework</groupId>  
  29.       <artifactId>spring-test</artifactId>  
  30.       <version>3.1.1.RELEASE</version>  
  31.     </dependency>  
  32.     <dependency>  
  33.       <groupId>org.apache.openjpa</groupId>  
  34.       <artifactId>openjpa</artifactId>  
  35.       <version>2.1.1</version>  
  36.       <scope>compile</scope>  
  37.     </dependency>  
  38.   </dependencies>  
  39. </project>  

因为pom.xml中没有配置src的未知,所以默认转换为maven项目之后,build path中的source中会变为空,这个时候要吧src重新增加进去,最简单的方法就是直接加!


 

三、增加slf4j记录日志

在src中新建一个log4j.properties文件,修改内容如下:

Cpp代码  收藏代码
  1. # This is the configuring for logging displayed in the Application Server  
  2. log4j.rootCategory=INFO, stdout  
  3.   
  4. #stdout configure  
  5. log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
  6. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
  7. log4j.appender.stdout.layout.ConversionPattern=[%-d{HH:mm:ss}-%p]%m%n  

 

四、转换为JPA项目

首先在Data Source Explorer中增加对应的数据库,Drivers没有请自己设置


 

然后右键项目,将其转换为JPA的项目


因为Eclipse没有直接支持OpenJPA,所以这里直接选择Generic2.0

 

完成后,Eclipse会自动在src中新建META-INF目录,在META-INF中新建persistence.xml文件,自动生成的大多不能用,结合OpenJPA的配置方法修改内容如下:

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">  
  3.   <persistence-unit name="StrongOpenJPAPU" transaction-type="RESOURCE_LOCAL">  
  4.     <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>  
  5.     <properties>  
  6.       <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />  
  7.       <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/strongjpa" />  
  8.       <property name="javax.persistence.jdbc.user" value="root" />  
  9.       <property name="javax.persistence.jdbc.password" value="root" />  
  10.   
  11.       <!-- 日志的级别 -->  
  12.       <property name="openjpa.Log" value="DefaultLevel=WARN, Runtime=WARN, Tool=INFO, SQL=TRACE" />  
  13.   
  14.       <property name="openjpa.RemoteCommitProvider" value="sjvm" />  
  15.       <!-- 启用缓存,并且设置缓存的容量为5000,并且禁用软引用容量 -->  
  16.       <property name="openjpa.DataCache" value="true(CacheSize=5000, SoftReferenceSize=100)" />  
  17.       <!-- 启用查询结果缓存,缓存的容量为1000,并且软引用的容量为100 -->  
  18.       <property name="openjpa.QueryCache" value="true(CacheSize=5000, SoftReferenceSize=100)" />  
  19.       <!-- 缓存的数据存储类型 -->  
  20.       <property name="openjpa.QueryCompilationCache" value="true" />  
  21.       <!-- 数据库连接工厂时的属性 QueryTimeout:JDBC驱动执行查询超时的时间,以秒为单位。 PrettyPrint:是否格式化输出SQL语句。 PrettyPrintLineLength:SQL每行输出的最大长度。 -->  
  22.       <property name="openjpa.ConnectionFactoryProperties" value="PrettyPrint=true, PrettyPrintLineLength=100" />  
  23.       <!-- 查询结果一次转化为对象的最多个数,相当于JDBC的结果集对象Statement.set FetchSize。默认为-1,表示所有的查询对象立即初始化;0表示使用JDBC驱动默认的数值 -->  
  24.       <property name="openjpa.FetchBatchSize" value="-1" />  
  25.     </properties>  
  26.   </persistence-unit>  
  27. </persistence>  

这些配置的参数在OpenJPA的文档中都有,因为没有找到中文的文档,大家有需要的话直接去看官方文档吧。其中有一个地方需要解释 的,javax.persistence.jdbc.driver等等这些参数是JPA标准,OpenJPA中也有类似的参数,一般情况下建议大家还是直 接使用标准参数来配置

 

五、生成Entities From Tables

转换为JPA项目之后,Eclipse就能够使用JPA Tools进行JPA的管理,尤其是Entities From Tables非常好用(虽然我重来不用 ^_^)。

右键项目,选择JPA Tools进行操作,我们先把数据库中的t_xx表转换出来


 

剩下的操作,大家就按照步骤来吧,因为演示的t_xx没有任何外键,所以按照最简单的方式转出来就可以。有可能自动生成后这个class会报错,这个时因为Eclipse诶有把TXx定义到persistence.xml中,如果报错大家就手工添加进去,下载的源码包内我已经手工修改过。

但是自动化生成的东西并不非常合适,至少在以后的通过Entities生成Tables的时候就存在很多的问题,因此我一般都用自己的做的一个转换工具进行代码自动生成。

com.strong.module.txx.jpa.TXx

Java代码  收藏代码
  1. package com.strong.module.txx.jpa;  
  2.   
  3. import java.util.Date;  
  4.   
  5. import javax.persistence.Column;  
  6. import javax.persistence.Entity;  
  7. import javax.persistence.GeneratedValue;  
  8. import javax.persistence.GenerationType;  
  9. import javax.persistence.Id;  
  10. import javax.persistence.SequenceGenerator;  
  11. import javax.persistence.Table;  
  12. import javax.persistence.Temporal;  
  13. import javax.persistence.TemporalType;  
  14.   
  15. /** 
  16.  * TXx entity 
  17.  *  
  18.  * @author Simen 自动生成时间: 2011-10-02 08:31:29 
  19.  */  
  20.   
  21. @Entity  
  22. @Table(name = "t_xx")  
  23. public class TXx implements java.io.Serializable {  
  24.   
  25.   /** 
  26.    *  
  27.    */  
  28.   private static final long serialVersionUID = 1L;  
  29.   
  30.   public static final String S_XXID = "xx_id"// PRIMARY  
  31.   public static final String S_XXBZ = "xx_bz"// 选项备注  
  32.   public static final String S_XXDM = "xx_dm"// 选项代码  
  33.   public static final String S_XXLX = "xx_lx"// 选项类型  
  34.   public static final String S_XXMC = "xx_mc"// 选项名称  
  35.   public static final String S_XXXH = "xx_xh"// 选项序号 在同一分类中的顺序号  
  36.   public static final String S_XXBY1 = "xx_by1"// 备用1  
  37.   public static final String S_XXBY2 = "xx_by2"// 备用2  
  38.   public static final String S_XXBY3 = "xx_by3"// 备用3  
  39.   public static final String S_XXBY4 = "xx_by4"// 备用4  
  40.   public static final String S_XXBY5 = "xx_by5"// 备用5  
  41.   public static final String S_XXBY6 = "xx_by6"// 备用6  
  42.   public static final String S_XXBY7 = "xx_by7"// 备用7  
  43.   public static final String S_XXBY8 = "xx_by8"// 备用8  
  44.   
  45.   // Fields  
  46.   private Integer xxId; // PRIMARY  
  47.   private String xxBz; // 选项备注  
  48.   private String xxDm; // 选项代码  
  49.   private String xxLx; // 选项类型  
  50.   private String xxMc; // 选项名称  
  51.   private Integer xxXh; // 选项序号 在同一分类中的顺序号  
  52.   private String xxBy1; // 备用1  
  53.   private String xxBy2; // 备用2  
  54.   private String xxBy3; // 备用3  
  55.   private Integer xxBy4; // 备用4  
  56.   private Integer xxBy5; // 备用5  
  57.   private Date xxBy6; // 备用6  
  58.   private Date xxBy7; // 备用7  
  59.   private Float xxBy8; // 备用8  
  60.   
  61.   public TXx() {  
  62.   
  63.   }  
  64.   
  65.   // Constructors  
  66.   
  67.   @Id  
  68.   @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "AuthorSeqXX")  
  69.   @SequenceGenerator(name = "AuthorSeqXX", allocationSize = 1)  
  70.   @Column(name = "xx_id", unique = true, nullable = false, insertable = true, updatable = true)  
  71.   public Integer getXxId() {  
  72.     return xxId;  
  73.   }  
  74.   
  75.   public void setXxId(Integer xxId) {  
  76.     this.xxId = xxId;  
  77.   }  
  78.   
  79.   @Column(name = "xx_bz", length = 255)  
  80.   public String getXxBz() {  
  81.     return xxBz;  
  82.   }  
  83.   
  84.   public void setXxBz(String xxBz) {  
  85.     this.xxBz = xxBz;  
  86.   }  
  87.   
  88.   @Column(name = "xx_dm", length = 255)  
  89.   public String getXxDm() {  
  90.     return xxDm;  
  91.   }  
  92.   
  93.   public void setXxDm(String xxDm) {  
  94.     this.xxDm = xxDm;  
  95.   }  
  96.   
  97.   @Column(name = "xx_lx", length = 255)  
  98.   public String getXxLx() {  
  99.     return xxLx;  
  100.   }  
  101.   
  102.   public void setXxLx(String xxLx) {  
  103.     this.xxLx = xxLx;  
  104.   }  
  105.   
  106.   @Column(name = "xx_mc", length = 255)  
  107.   public String getXxMc() {  
  108.     return xxMc;  
  109.   }  
  110.   
  111.   public void setXxMc(String xxMc) {  
  112.     this.xxMc = xxMc;  
  113.   }  
  114.   
  115.   @Column(name = "xx_xh", length = 10)  
  116.   public Integer getXxXh() {  
  117.     return xxXh;  
  118.   }  
  119.   
  120.   public void setXxXh(Integer xxXh) {  
  121.     this.xxXh = xxXh;  
  122.   }  
  123.   
  124.   @Column(name = "xx_by1", length = 255)  
  125.   public String getXxBy1() {  
  126.     return xxBy1;  
  127.   }  
  128.   
  129.   public void setXxBy1(String xxBy1) {  
  130.     this.xxBy1 = xxBy1;  
  131.   }  
  132.   
  133.   @Column(name = "xx_by2", length = 255)  
  134.   public String getXxBy2() {  
  135.     return xxBy2;  
  136.   }  
  137.   
  138.   public void setXxBy2(String xxBy2) {  
  139.     this.xxBy2 = xxBy2;  
  140.   }  
  141.   
  142.   @Column(name = "xx_by3", length = 255)  
  143.   public String getXxBy3() {  
  144.     return xxBy3;  
  145.   }  
  146.   
  147.   public void setXxBy3(String xxBy3) {  
  148.     this.xxBy3 = xxBy3;  
  149.   }  
  150.   
  151.   @Column(name = "xx_by4", length = 10)  
  152.   public Integer getXxBy4() {  
  153.     return xxBy4;  
  154.   }  
  155.   
  156.   public void setXxBy4(Integer xxBy4) {  
  157.     this.xxBy4 = xxBy4;  
  158.   }  
  159.   
  160.   @Column(name = "xx_by5", length = 10)  
  161.   public Integer getXxBy5() {  
  162.     return xxBy5;  
  163.   }  
  164.   
  165.   public void setXxBy5(Integer xxBy5) {  
  166.     this.xxBy5 = xxBy5;  
  167.   }  
  168.   
  169.   @Temporal(TemporalType.TIMESTAMP)  
  170.   @Column(name = "xx_by6", length = 19)  
  171.   public Date getXxBy6() {  
  172.     return xxBy6;  
  173.   }  
  174.   
  175.   public void setXxBy6(Date xxBy6) {  
  176.     this.xxBy6 = xxBy6;  
  177.   }  
  178.   
  179.   @Temporal(TemporalType.TIMESTAMP)  
  180.   @Column(name = "xx_by7", length = 19)  
  181.   public Date getXxBy7() {  
  182.     return xxBy7;  
  183.   }  
  184.   
  185.   public void setXxBy7(Date xxBy7) {  
  186.     this.xxBy7 = xxBy7;  
  187.   }  
  188.   
  189.   @Column(name = "xx_by8", length = 12)  
  190.   public Float getXxBy8() {  
  191.     return xxBy8;  
  192.   }  
  193.   
  194.   public void setXxBy8(Float xxBy8) {  
  195.     this.xxBy8 = xxBy8;  
  196.   }  
  197.   
  198. }  

 

com.strong.module.txx.jpa.TXx_ 这个类比较奇特,是JPA规范中定义个一个特殊类,主要的作用是构造查询,这个以后再说

Java代码  收藏代码
  1. package com.strong.module.txx.jpa;  
  2.   
  3. import java.util.Date;  
  4.   
  5. import javax.persistence.metamodel.SingularAttribute;  
  6. import javax.persistence.metamodel.StaticMetamodel;  
  7.   
  8. /** 
  9.  * TXx_ entity 
  10.  *  
  11.  * @author Simen 自动生成时间: 2011-10-02 08:31:29 
  12.  */  
  13.   
  14. @StaticMetamodel(TXx.class)  
  15. public abstract class TXx_ {  
  16.   
  17.   public static volatile SingularAttribute<TXx, Integer> xxId;  
  18.   public static volatile SingularAttribute<TXx, String> xxBz;  
  19.   public static volatile SingularAttribute<TXx, String> xxDm;  
  20.   public static volatile SingularAttribute<TXx, String> xxLx;  
  21.   public static volatile SingularAttribute<TXx, String> xxMc;  
  22.   public static volatile SingularAttribute<TXx, Integer> xxXh;  
  23.   public static volatile SingularAttribute<TXx, String> xxBy1;  
  24.   public static volatile SingularAttribute<TXx, String> xxBy2;  
  25.   public static volatile SingularAttribute<TXx, String> xxBy3;  
  26.   public static volatile SingularAttribute<TXx, Integer> xxBy4;  
  27.   public static volatile SingularAttribute<TXx, Integer> xxBy5;  
  28.   public static volatile SingularAttribute<TXx, Date> xxBy6;  
  29.   public static volatile SingularAttribute<TXx, Date> xxBy7;  
  30.   public static volatile SingularAttribute<TXx, Float> xxBy8;  
  31.   
  32. }  

 

六、配置Spring

在src下新建applicationContext.xml文件如下:

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"  
  3.   xsi:schemaLocation="  
  4.     http://www.springframework.org/schema/beans   
  5.     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd   
  6.     http://www.springframework.org/schema/context   
  7.     http://www.springframework.org/schema/context/spring-context-3.0.xsd   
  8.     http://www.springframework.org/schema/tx   
  9.     http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">  
  10.   
  11.   <!-- 注解扫描 -->  
  12.   <context:component-scan base-package="com.strong" />  
  13.   
  14.   <!--整合Spring和JPA -->  
  15.   <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">  
  16.     <property name="persistenceUnitName" value="StrongOpenJPAPU" />  
  17.     <property name="loadTimeWeaver">  
  18.       <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />  
  19.     </property>  
  20.   </bean>  
  21.   
  22.   
  23.   <!--注入事务管理类 -->  
  24.   <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">  
  25.     <property name="entityManagerFactory" ref="entityManagerFactory" />  
  26.   </bean>  
  27.   
  28.   <!--允许使用注解方式配置事务 -->  
  29.   <tx:annotation-driven transaction-manager="transactionManager" />  
  30. </beans>  

 

七、建立Junit测试单元

新建一个类:test.com.strong.StringOpenJPATest

Java代码  收藏代码
  1. package test.com.strong;  
  2.   
  3. import javax.persistence.EntityManager;  
  4. import javax.persistence.PersistenceContext;  
  5.   
  6. import org.junit.Test;  
  7. import org.junit.runner.RunWith;  
  8. import org.springframework.test.context.ContextConfiguration;  
  9. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;  
  10.   
  11. @RunWith(SpringJUnit4ClassRunner.class)  
  12. @ContextConfiguration(locations = { "classpath:applicationContext.xml" })  
  13. public class StringOpenJPATest {  
  14.   
  15.   // 使用注解的方式注入,3.1以前版本使用JpaDaoSupport和JpaTemplate实现  
  16.   @PersistenceContext  
  17.   private EntityManager entityManager;  
  18.   
  19.   @Test  
  20.   public void doTest() {  
  21.     System.out.println("=====Hello OpenJPA " + entityManager + "=======");  
  22.   }  
  23.   
  24. }  

这里和Spring3.1以前的版本有一些不同,具体内容请参见Spring3.1+ JpaDaoSupport被deprecated后的研究

 

执行测试获得结果如下:

Cpp代码  收藏代码
  1. ......  
  2. =====Hello OpenJPA Shared EntityManager proxy for target factory [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@6087e704]=======  
  3. .......  

到这里,我们成功的运行起来Spring+OpenJPA,并获取了对应的EntityManager,下一步将在这个的基础之上其他的操作,因为我是按照最初始的步骤进行的,所以现在的配置文件正式运行可能定存在问题,下节将进行详细的介绍

 

 

本节资源下载

 

SQL文件:strongjpa.sql.tar.gz

项目文件:StrongOpenJPA.tar.gz

0 0