JPA搞了有一段时间了,现在写一点自己的感受和一个实例和大家分享。JPA(java persistence API)java持久层规范,也就是相当于一种对ORM的规定(规则)。Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用的对象持久化的开发工作;其二,Sun希望整合对ORM技术,实现天下归一。(对于jpa)不大了解的可以查考附件中的教程。本例用的hibernate的版本是4.1.1 J2SE5
在mysql数据库中建立jpa数据库(creaeta database jpa;)表可以不建要是不能自动建立的话手动写一下
文件结构:
一个简单的POJO User.java (注释以写若不清楚详情请看附件教程)
package org.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity(name="t_user")//将领域对象标注为一个实体,默认类名即表明但是可以同意name属性指定
public class User {
//primary id
@Id//指定该属性为表中的主键
/*
*主键的产生策略,通过strategy属性指定。
*默认情况下,JPA自动选择一个最适合底层数据库的主键生成策略,如SqlServer对应identity,MySql对应auto increment。
*/
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id")
private int id;
//user name
/**
* @Column(name = "name"):
* 属性对应的表字段。我们并不需要指定表字段的类型,因为JPA会根据反射从实体属性中获取类型;如果是字符串类型,我们可以指定字段长度,以便可以自动生成DDL语句
* @Temporal(TemporalType.DATE):如果属性是时间类型,因为数据表对时间类型有更严格的划分,所以必须指定具体时间类型
*/
@Column(name="name")
private String name;
//password
@Column(name="password")
private String password;
//省略的get和set方法
persistence。xml (必须在指定的文件夹下否则找不到)
<?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">
<!-- 为持久化单元取名为 myJPA -->
<persistence-unit name="myJPA" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>org.entity.User</class>
<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="root" />
<!--配置数据库密码 -->
<property name="hibernate.connection.password" value="123456" />
<!--配置数据库url -->
<property name="hibernate.connection.url"
value="jdbc:mysql://127.0.0.1:3306/jpa?useUnicode=true" />
<!--设置外连接抓取树的最大深度 -->
<property name="hibernate.max_fetch_depth" value="3" />
<!--自动输出schema创建DDL语句 -->
<!-- <property name="hibernate.hbm2ddl.auto" value="update" /> -->
<property name="hibernate.hbm2ddl.auto" value="validate"/>
</properties>
</persistence-unit>
</persistence>
Test:
package org.test;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.entity.User;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class TestJPA {
EntityManagerFactory emf = null;
@Before
public void before() {
emf = Persistence.createEntityManagerFactory("myJPA");
}
// add user
@Test
public void addTest() {
User user = new User();
user.setName("JJJ");
user.setPassword("222");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
System.out.println("entitymanager");
em.persist(user);
em.getTransaction().commit();
em.close();
}
@After
public void after() {
if (null != emf) {
emf.close();
}
}
}
结果: