首页 > 代码库 > JPA开发总结<二>--代码整理

JPA开发总结<二>--代码整理

首先看下使用JPA规范的注解方式模板(代码中解释很详细):

@Entity(name="person")
public class Person {

	//GenerationType为AUTO是权衡mysql和oracle不同,也可以对应具体数据库选择IDENTITY或者SEQUENCE
	@Id @GeneratedValue(strategy=GenerationType.AUTO)
	private Integer id;
	
	//不能为空就设为false
	@Column(length=10,nullable=false,name="pname")
	private String name;
	//时间类型
	@Temporal(TemporalType.DATE)
	private Date birthday;
	
	//枚举型举例,EnumType.ORDINAL是将索引值存入数据库
	//@Enumerated枚举类型的性别(必须加上非空约束),设置默认值
	@Enumerated(EnumType.STRING) @Column(length=5,nullable=false)
	private Gender gender = Gender.MAN;
	
	//存储大文本,二进制数据,数据库字段格式longblob @Lob用于二进制数据  @Basic(fetch=LAZY)延迟初始化该属性,一般用于大数据(超过1M)
	//basic注解作用类似hibernate延迟加载(LAZY),在person没有getFile时不加载此字段,
	//因为其容量太大,占用内存太大,同时,如果在关闭session后getFile也会报懒加载异常
	@Lob @Basic(fetch=FetchType.LAZY)
	private Byte[] file;
	//数据库字段类型为longtext @Lob大文本类型
	@Lob
	private String info;
	//这个注解是不在数据库中映射这个字段 @Transient不持久化这个属性
	@Transient
	private String imagePath;
       <!-- 相应的get set方法省略 -->
}

对于数据库的基本操作方法模板:

	private static EntityManagerFactory factory;
	private static EntityManager em;
	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
		factory = Persistence.createEntityManagerFactory("jpatest1");
		em = factory.createEntityManager();
	}
	
	@Test
	public void savePerson() {
		em.getTransaction().begin(); //开启事务
		em.persist(new Person("张三")); //持久化对象(相当于Hibernate的save/persist方法)
		em.getTransaction().commit(); //提交事务
		em.close(); //关闭
		factory.close(); //关闭
	}
	
	@Test
	public void getPerson1() {
		
		//find() : 根据id得到某个Person对象。相当于Hibernate的get()方法,即时加载
		//如果要找的数据不存在,返回null值
		Person person = em.find(Person.class, 1); 
		System.out.println(person.getName());
		
		//重新刷新数据库中的数据,防止数据被别人修改过
		em.refresh(person);
		
		em.close(); //关闭
		factory.close(); //关闭
	}
	
	@Test
	public void getPerson2() {
		
		//getReference() : 根据id得到某个Person对象.相当于Hibernate的load()方法,延迟加载
		//如果数据不存在,报错
		Person person = em.getReference(Person.class, 1); 
		
		//如果不调用这句代码,不会从数据库加载数据
		System.out.println(person.getName());
		
		em.close(); //关闭
		factory.close(); //关闭
	}
	
	@Test
	public void updatePerson1() {
		
		em.getTransaction().begin(); //开启事务
		
		Person person = em.find(Person.class, 1);
		//条件:1.关联事务
		//		2.对象处于托管(managed)状态。 JPA一共四种状态:初始状态 , 托管状态, 游离状态, 删除状态
		person.setName("李四"); //可以修改到数据库
		
		em.getTransaction().commit(); //提交事务
		em.close(); //关闭
		factory.close(); //关闭
	}
	
	@Test
	public void updatePerson2() {
		
		em.getTransaction().begin(); //开启事务
		Person person = em.find(Person.class, 1);
		//将实体管理器中的所有实体变成游离状态
		em.clear(); 
		//游离状态的数据不能持久化到数据库
		person.setName("王五"); 
		//把游离态的更新同步回数据库
		em.merge(person); 
		em.getTransaction().commit(); //提交事务
		em.close(); //关闭
		factory.close(); //关闭
	}
	
	@Test
	public void deletePerson1() {
		
		em.getTransaction().begin(); //开启事务
		Person person = em.find(Person.class, 1);
		//删除某个实体
		em.remove(person);
		em.getTransaction().commit(); //提交事务
		em.close(); //关闭
		factory.close(); //关闭
	}
	//这里注意jpql操作的数据库名和字段名是类名字,不是自定义到数据库的名字
	@Test
	public void jpqlQuery() {
		
		Query query = em.createQuery("select o from person o where o.id = ?1");
		query.setParameter(1, 1);
//		query.getResultList(); //等同于Hibernate的list()方法
		Person person = (Person)query.getSingleResult();
		System.out.println(person.getName());
//		Query query2 = em.createQuery("select count(0) from Person o");
//		query2.getSingleResult(); //等同于Hibernate的uniqueResult()方法
		
		em.close(); //关闭
		factory.close(); //关闭
	}
	
	@Test
	public void deleteQuery() {
		em.getTransaction().begin(); //开启事务
		
		Query query = em.createQuery("delete from person o where o.id = ?1");
		query.setParameter(1, 2);
		//删除的更新方法,没有它立即刷新看不到数据删除
		query.executeUpdate();
		
		em.getTransaction().commit(); //提交事务
		em.close(); //关闭
		factory.close(); //关闭
	}
	
	@Test
	public void updateQuery() {
		em.getTransaction().begin(); //开启事务
		
		Query query = em.createQuery("update person o set o.name=:name where o.id = ?1");
		query.setParameter("name", "赵六");
		query.setParameter(1, 1);
		//删除的更新方法
		query.executeUpdate();
		
		em.getTransaction().commit(); //提交事务
		em.close(); //关闭
		factory.close(); //关闭
	}

最后再次附上META-INF目录下的persistence.xml文件配置:

<persistence 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"
   version="1.0">
   <!-- 持久化单元名字name=jpatest1,这个和前面createEntitymanagerFactory名字一致 -->
   <persistence-unit name="jpatest1" transaction-type="RESOURCE_LOCAL">
      <properties>
			<property name="hibernate.dialect" value=http://www.mamicode.com/"org.hibernate.dialect.MySQL5Dialect" />>JPA开发最基本的操作配置信息就全了,下一步就是对一对多,一对一,多对多的配置作介绍。




JPA开发总结<二>--代码整理