首先看下使用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="org.hibernate.dialect.MySQL5Dialect" /> <property name="hibernate.max_fetch_depth" value="3" /> <property name="hibernate.connection.driver_class" value="org.gjt.mm.mysql.Driver"/> <property name="hibernate.connection.username" value="root" /> <property name="hibernate.connection.password" value="123456" /> <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/jpa?useUnicode=true&characterEncoding=UTF-8" /> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.hbm2ddl.auto" value="update" /> <property name="hibernate.format_sql" value="true" /> </properties> </persistence-unit> </persistence>
JPA开发最基本的操作配置信息就全了,下一步就是对一对多,一对一,多对多的配置作介绍。
时间: 2024-10-20 06:11:53