JPA学习

JPA是一套对象持久化规范,可以通过多种工具实现它。比如常见的Hibernate。按说初学就该照猫画虎的写例子,可是总改不了探究为什么的好奇心。于是在经历了不少曲折和困惑之后,终于把Hibernateeclipselink两种实现的例子都完成了,也体会了一点二者的区别。

先看在eclipse里的默认jpa项目的做法:

新建JPAProject,填写项目名称和Target runtime(因为只是个简单的例子,不需要部署到服务器上,就选了jre),再点几次next之后,就过不去了,因为要求必须使用一个UserLibrary。实际上这就是要求添加实现jpa的类库。如果使用eclipselink可以选择下载,如果使用hibernate,可以新建一个,然后把hibernate包里的各个jar文件加进来。最终二者就是在persistence.xml文件的描述上有些许区别,这也是JPA规范的目的所在――使代码尽量不要绑定特定的ORM框架。下面是eclipselink示例代码:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.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_2_0.xsd">
    <persistence-unit name="jpa-link2" transaction-type="RESOURCE_LOCAL">
                                     
        <class>com.jpalink2.zjc.Connect</class>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpa"/>
            <property name="javax.persistence.jdbc.user" value="java"/>
            <property name="javax.persistence.jdbc.password" value="111111"/>
                                          
            <!-- 这个设置不知道为什么不起作用,不能自动建表,:( -->
            <property name="eclipelink.ddl-generation" value="drop-and-create-tables"/>
        </properties>
    </persistence-unit>
</persistence>

Entity代码

package com.jpalink2.zjc;
import javax.persistence.*;
/**
 * Entity implementation class for Entity: Connect
 *
 */
@Entity
@Table(name="contacts")
public class Connect {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
                    
    private String name;
                    
    private String tel;
                    
    public String getName() {
        return this.name;
    }
    public void setName(String name) {
        this.name = name;
    }
                    
    public String getTel() {
        return this.tel;
    }
    public void setTel(String tel) {
        this.tel = tel;
    }
                   
    public static void main(String[] arg){
        EntityManagerFactory emf =Persistence.createEntityManagerFactory("jpa-link2");
        Connect c=new Connect();
        c.setName("hanmeimei");
        c.setTel("13912423846");
        EntityManager em = emf.createEntityManager();
         em.getTransaction().begin();
         em.persist(c);
         em.getTransaction().commit();
         em.close();
         emf.close();
    }  
}

Hibernate示例代码:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.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_2_0.xsd">
    <persistence-unit name="jpa-hibernate">
        <properties>
            <!--配置Hibernate方言 -->
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
            <!--配置数据库驱动 -->
            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
            <!--配置数据库用户名 -->
            <property name="hibernate.connection.username" value="java" />
            <!--配置数据库密码 -->
            <property name="hibernate.connection.password" value="111111" />
            <!--配置数据库url -->
            <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/jpa" />
            <!--设置外连接抓取树的最大深度 -->
            <property name="hibernate.max_fetch_depth" value="3" />
            <!--自动输出schema创建DDL语句 -->
            <property name="hibernate.hbm2ddl.auto" value="update" />   
        </properties>
    </persistence-unit>
</persistence>

Entity代码

package com.jpahibernate.zjc;
import javax.persistence.*;
/**
 * Entity implementation class for Entity: Connect
 *
 */
@Entity
@Table(name="contacts")
public class Connect {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
          
    private String name;
          
    private String tel;
          
    public String getName() {
        return this.name;
    }
    public void setName(String name) {
        this.name = name;
    }  
    public String getTel() {
        return this.tel;
    }
    public void setTel(String tel) {
        this.tel = tel;
    }
         
    public static void main(String[] arg){
        EntityManagerFactory emf =Persistence.createEntityManagerFactory("jpa-hibernate");
        Connect c=new Connect();
        c.setName("zhangxiaoga");
        c.setTel("13912423846");
        EntityManager em = emf.createEntityManager();
         em.getTransaction().begin();
         em.persist(c);
         em.getTransaction().commit();
         em.close();
         emf.close();
    }
}

除了包名不同,其他代码一模一样。两个项目也都用的同一张表,先执行这个项目可以自动创建表,再执行上面的项目就不会报错了。

几个小插曲:

noinstall版本的mysql在修改my.ini的时候,增加basedirdatadir路径需要用/分隔,如:d:/soft/mysql,否则启动不了服务

选择创建普通java project也是可以完成示例的。而如果选择创建的是JPAProject,每添加一个@Entity注释的类,系统就会自动去检查是否增加到了persistence.xml中(没有添加也可以执行,但作为有点强迫症的程序员,看着这个红叉实在是难受),如果不希望系统检查,删掉.project中的语句――<nature>org.eclipse.wst.common.project.facet.core.nature</nature>,重启eclipse即可。

你可能感兴趣的:(Hibernate,jpa,eclipselink)