在向大家详细介绍Hibernate之前,首先让大家了解下调用JPA的代码和调用Hibernate的代码,然后全面介绍Hibernate映射文件。
由于JPA是不需要配置的,代码里面已经包括了注释,所以下面附上Hibernate映射文件,为了使数据库里面更清楚一些,所以两者使用的表不是同一张表,JPA的表是带JPA前缀的,用@Table这个注释声明了这一点。
1. <?xml version="1.0" encoding="UTF-8"?>
2.
3. <!DOCTYPE hibernate-mapping PUBLIC
4. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
5. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
6. <hibernate-mapping package="com.hadeslee.jpaentity">
7. <class name="Department" table="Department">
8. <id name="id" column="departId" type="long">
9. <generator class="native"/>
10. </id>
11. <property name="deptName"/>
12. <property name="description"/>
13. <set name="persons">
14. <key column="deptId"/>
15. <one-to-many class="Person"/>
16. </set>
17. </class>
18. <class name="Person" table="Person">
19. <id name="id" column="personId" type="long">
20. <generator class="native"/>
21. </id>
22. <property name="name"/>
23. <property name="age"/>
24. <many-to-one name="department" column="deptId" class="Department"/>
25. </class>
26. </hibernate-mapping>
调用JPA的代码如下:
1. EntityManagerFactory emf = Persistence.createEntityManagerFactory("TestSSH1PU2");
2. EntityManager em = emf.createEntityManager();
3. em.getTransaction().begin();
4. com.hadeslee.jpaentity.Person p = new com.hadeslee.jpaentity.Person();
5. p.setAge(26);
6. p.setName("千里冰封");
7.
8. com.hadeslee.jpaentity.Department dept = em.find
(com.hadeslee.jpaentity.Department.class, Long.valueOf("3"));
9. System.out.println("找到的dept=" + dept);
10. em.remove(dept);
11. em.getTransaction().commit();
调用Hibernate的代码如下:
1. Session session = HibernateUtil.getSessionFactory().getCurrentSession();
2. session.getTransaction().begin();
3. Department dept = (Department) session.load(Department.class, 2);
4. session.delete(dept);
5. session.getTransaction().commit();
最后发现是JPA是不能删除的,而Hibernate这边的调用可以删除,一开始我还以为是toplink的实现问题,后来特意把实现改成 Hibernate的实现,也同样。所以有可能是JPA的要求必须得这样做,不能替我们自动完成一些东西,是利于安全。这可能就是标准和流行的差别吧。以上介绍Hibernate映射文件。
由于JPA是不需要配置的,代码里面已经包括了注释,所以下面附上Hibernate映射文件,为了使数据库里面更清楚一些,所以两者使用的表不是同一张表,JPA的表是带JPA前缀的,用@Table这个注释声明了这一点。
1. <?xml version="1.0" encoding="UTF-8"?>
2.
3. <!DOCTYPE hibernate-mapping PUBLIC
4. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
5. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
6. <hibernate-mapping package="com.hadeslee.jpaentity">
7. <class name="Department" table="Department">
8. <id name="id" column="departId" type="long">
9. <generator class="native"/>
10. </id>
11. <property name="deptName"/>
12. <property name="description"/>
13. <set name="persons">
14. <key column="deptId"/>
15. <one-to-many class="Person"/>
16. </set>
17. </class>
18. <class name="Person" table="Person">
19. <id name="id" column="personId" type="long">
20. <generator class="native"/>
21. </id>
22. <property name="name"/>
23. <property name="age"/>
24. <many-to-one name="department" column="deptId" class="Department"/>
25. </class>
26. </hibernate-mapping>
调用JPA的代码如下:
1. EntityManagerFactory emf = Persistence.createEntityManagerFactory("TestSSH1PU2");
2. EntityManager em = emf.createEntityManager();
3. em.getTransaction().begin();
4. com.hadeslee.jpaentity.Person p = new com.hadeslee.jpaentity.Person();
5. p.setAge(26);
6. p.setName("千里冰封");
7.
8. com.hadeslee.jpaentity.Department dept = em.find
(com.hadeslee.jpaentity.Department.class, Long.valueOf("3"));
9. System.out.println("找到的dept=" + dept);
10. em.remove(dept);
11. em.getTransaction().commit();
调用Hibernate的代码如下:
1. Session session = HibernateUtil.getSessionFactory().getCurrentSession();
2. session.getTransaction().begin();
3. Department dept = (Department) session.load(Department.class, 2);
4. session.delete(dept);
5. session.getTransaction().commit();
最后发现是JPA是不能删除的,而Hibernate这边的调用可以删除,一开始我还以为是toplink的实现问题,后来特意把实现改成 Hibernate的实现,也同样。所以有可能是JPA的要求必须得这样做,不能替我们自动完成一些东西,是利于安全。这可能就是标准和流行的差别吧。以上介绍Hibernate映射文件。