<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/persistence_1_0.xsd" version="1.0"> <persistence-unit name="itcast" transaction-type="RESOURCE_LOCAL"> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" /> <property name="hibernate.hbm2ddl.auto" value="update"/> <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="456" /> <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/itcast?useUnicode=true&characterEncoding=UTF-8" /> </properties> </persistence-unit> </persistence>
第二步写:Person.java (实体bean)
package cn.itcast.bean; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity //以javax开头的包,都是Sun公司制定的一些规范 public class Person { private Integer id; private String name; public Person() { /*对象是由Hibernate为我们创建的,当我们通过ID来获取某个实体的时候,这个实体给我们返回了这个对象的创建是由Hibernate内部通过反射技术来创建的,反射的时候用到了默认的构造函数,所以这时候必须给它提供一个public的无参构造函数。*/ } public Person(String name) { this.name = name; } @Id @GeneratedValue(strategy=GenerationType.AUTO) //auto默认,可不写,直接写@GeneratedValue public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
第三步:PersonTest.java (junit单元测试)
package junit.test; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import org.junit.BeforeClass; import org.junit.Test; import cn.itcast.bean.Person; public class PersonTest { @BeforeClass public static void setUpBeforeClass() throws Exception { } @Test public void save(){ //对实体bean进行操作,第一步应该获取什么对象啊? SessionFactory对象 //这里用获取的EntityManagerFactory对象,这可以把它看成跟Hibernate的SessionFactory对象差不多的东西 EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast"); //参数"itcast"是persistence.xml文件中<persistence-unit name="itcast">name的属性值。 EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); //开启事务 em.persist(new Person("传智播客")); //持久化对象 em.getTransaction().commit(); //提交事务 em.close(); factory.close(); //SessionFactory --> Session --> begin事务 } }
/*
session.save(obj);
persist这方法在Hibernate里也存在,Hibernate的作者已经不太推荐大家用save方法,而是推荐大家用persist方法 。
why? 首先并不是代码上的问题,主要是这个名字上的问题,因为我们把这个ORM技术叫做持久化产品,那么我们对某个对象持久化,应该叫持久化,而不应该叫保存,所以后来Hibernate的作者推荐用persist方法,这并不是功能的问题, 主要是取名的问题,所以用persist方法也可以 。
*/
目前数据库表是不存在的,我们采取实体(领域)建模的思想,让它根据实体bean来生成数据库表,在persistence.xml里,<property name="hibernate.hbm2ddl.auto" value="update"/>,生成策略是update,就是说表不存在的时候,它会创建数据库表。
问题,它什么时候创建表啊?创建表的时机是在什么时候创建的啊?答案是得到SessionFactory的时候,在JPA里也一样,是我们得到EntityManagerFactory的时候创建表,也就是说我们只要执行下面的那段代码就生成表了。
public class PersonTest { @BeforeClass public static void setUpBeforeClass() throws Exception { } @Test public void save(){ EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast"); factory.close(); } }
通过这个特性,可以在开发的时候,用来验证我们编写的实体映射元数据是否是正确的,通过这个就可以判断。如果生成不了表,就说明是编写的实体映射出问题了(比如实体bean),以后要学会怎样排错。