`
guohui_fz
  • 浏览: 56234 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

JPA和hibernate对删除操作的不同

阅读更多

在hibernate里面调用session的delete方法以后,无论这个被删除的对象有没有被人外键引用到,都可以被删除,并且此时的外键设为 null,也就是说他会自动帮我们去查看他被谁引用到了。然后把引用全部去掉后,再把自己删掉。而在JPA里面,如果调用 EntityManager.remove方法时,传进去的对象,有被外键引用到,则会失败。因为JPA里面的实现就是直接执行delete语句,也不管 他有没有被外键引用,此时,当然会出错了。

测试时候使用的两个类分别如下:

举的例子是部门和员工的关系。一个部门可以有多个员工。然后把部门删掉的时候,员工的部门属性就为null了,不过,按照严谨来说,还是JPA的严谨一些。这样可以防止误操作,呵呵。


部门的实体对象

<!---->/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 
*/
package  com.hadeslee.jpaentity;

import  java.io.Serializable;
import  java.util.HashSet;
import  java.util.Set;
import  javax.persistence.Entity;
import  javax.persistence.GeneratedValue;
import  javax.persistence.GenerationType;
import  javax.persistence.Id;
import  javax.persistence.OneToMany;
import  javax.persistence.Table;

/**
 *
 * 
@author  hadeslee
 
*/
@Entity
@Table(name 
=   " JPADepartment " )
public   class  Department  implements  Serializable {

    
private   static   final   long  serialVersionUID  =   1L ;
    @Id
    @GeneratedValue(strategy 
=  GenerationType.AUTO)
    
private  Long id;
    @OneToMany(mappedBy 
=   " department " )
    
private  Set < Person >  persons  =   new  HashSet < Person > ();
    
private  String deptName;
    
private  String description;

    
public  String getDeptName() {
        
return  deptName;
    }

    
public   void  setDeptName(String deptName) {
        
this .deptName  =  deptName;
    }

    
public  String getDescription() {
        
return  description;
    }

    
public   void  setDescription(String description) {
        
this .description  =  description;
    }
    
    
public  Set < Person >  getPersons() {
        
return  persons;
    }

    
public   void  setPersons(Set < Person >  persons) {
        
this .persons  =  persons;
    }

    
public  Long getId() {
        
return  id;
    }

    
public   void  setId(Long id) {
        
this .id  =  id;
    }

    @Override
    
public   int  hashCode() {
        
int  hash  =   0 ;
        hash 
+=  (id  !=   null   ?  id.hashCode() :  0 );
        
return  hash;
    }

    @Override
    
public   boolean  equals(Object object) {
        
//  TODO: Warning - this method won't work in the case the id fields are not set
         if  ( ! (object  instanceof  Department)) {
            
return   false ;
        }
        Department other 
=  (Department) object;
        
if  (( this .id  ==   null   &&  other.id  !=   null ||  ( this .id  !=   null   &&   ! this .id.equals(other.id))) {
            
return   false ;
        }
        
return   true ;
    }

    @Override
    
public  String toString() {
        
return   " com.hadeslee.jpaentity.Department[id= "   +  id  +   " ] " ;
    }
}


人员的实体对象

<!---->/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 
*/
package  com.hadeslee.jpaentity;

import  java.io.Serializable;
import  javax.persistence.Entity;
import  javax.persistence.GeneratedValue;
import  javax.persistence.GenerationType;
import  javax.persistence.Id;
import  javax.persistence.ManyToOne;
import  javax.persistence.Table;

/**
 *
 * 
@author  hadeslee
 
*/
@Entity
@Table(name 
=   " JPAPerson " )
public   class  Person  implements  Serializable {

    
private   static   final   long  serialVersionUID  =   1L ;
    @Id
    @GeneratedValue(strategy 
=  GenerationType.AUTO)
    
private  Integer id;
    
private  String name;
    
private   int  age;
    @ManyToOne
    
private  Department department;

    
public   int  getAge() {
        
return  age;
    }

    
public   void  setAge( int  age) {
        
this .age  =  age;
    }

    
public  Department getDepartment() {
        
return  department;
    }

    
public   void  setDepartment(Department department) {
        
this .department  =  department;
    }

    
public  String getName() {
        
return  name;
    }

    
public   void  setName(String name) {
        
this .name  =  name;
    }

    
public  Integer getId() {
        
return  id;
    }

    
public   void  setId(Integer id) {
        
this .id  =  id;
    }

    @Override
    
public   int  hashCode() {
        
int  hash  =   0 ;
        hash 
+=  (id  !=   null   ?  id.hashCode() :  0 );
        
return  hash;
    }

    @Override
    
public   boolean  equals(Object object) {
        
//  TODO: Warning - this method won't work in the case the id fields are not set
         if  ( ! (object  instanceof  Person)) {
            
return   false ;
        }
        Person other 
=  (Person) object;
        
if  (( this .id  ==   null   &&  other.id  !=   null ||  ( this .id  !=   null   &&   ! this .id.equals(other.id))) {
            
return   false ;
        }
        
return   true ;
    }

    @Override
    
public  String toString() {
        
return   " com.hadeslee.jpaentity.Person[id= "   +  id  +   " ] " ;
    }
}



由于JPA是不需要配置的,代码里面已经包括了注释,所以下面附上Hibernate的映射文件,为了使数据库里面更清楚一些,所以两者使用的表不是同一张表,JPA的表是带JPA前缀的,用@Table这个注释声明了这一点。

<!----><? xml version="1.0" encoding="UTF-8" ?>

<! DOCTYPE hibernate-mapping PUBLIC
  "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
< hibernate-mapping  package ="com.hadeslee.jpaentity" >
    
< class  name ="Department"  table ="Department" >
        
< id  name ="id"  column ="departId"  type ="long" >
            
< generator  class ="native" />
        
</ id >
        
< property  name ="deptName" />
        
< property  name ="description" />
        
< set  name ="persons" >
            
< key  column ="deptId" />
            
< one-to-many  class ="Person" />
        
</ set >
    
</ class >
    
< class  name ="Person"  table ="Person" >
        
< id  name ="id"  column ="personId"  type ="long" >
            
< generator  class ="native" />
        
</ id >
        
< property  name ="name" />
        
< property  name ="age" />
        
< many-to-one  name ="department"  column ="deptId"  class ="Department" />
     
</ class >
</ hibernate-mapping >


调用JPA的代码如下:

<!----> EntityManagerFactory emf  =  Persistence.createEntityManagerFactory( " TestSSH1PU2 " );
        EntityManager em 
=  emf.createEntityManager();
        em.getTransaction().begin();
        com.hadeslee.jpaentity.Person p 
=   new  com.hadeslee.jpaentity.Person();
        p.setAge(
26 );
        p.setName(
" 千里冰封 " );

        com.hadeslee.jpaentity.Department dept 
=  em.find(com.hadeslee.jpaentity.Department. class , Long.valueOf( " 3 " ));
        System.out.println(
" 找到的dept= "   +  dept);
        em.remove(dept);
        em.getTransaction().commit();


调用hibernate的代码如下:

<!---->Session session  =  HibernateUtil.getSessionFactory().getCurrentSession();
        session.getTransaction().begin();
        Department dept 
=  (Department) session.load(Department. class 2 );
        session.delete(dept);
        session.getTransaction().commit();


最后发现是JPA是不能删除的,而hibernate这边的调用可以删除,一开始我还以为是toplink的实现问题,后来特意把实现改成 hibernate的实现,也同样。所以有可能是JPA的要求必须得这样做,不能替我们自动完成一些东西,是利于安全。这可能就是标准和流行的差别吧。呵 呵。



分享到:
评论

相关推荐

    JPA和Hibernate的关系

    2. **JPA的API**:提供了用于操作实体对象的一系列API,包括创建、读取、更新和删除(CRUD)操作。这些API使得开发者无需编写复杂的JDBC和SQL代码即可实现数据的持久化。 3. **查询语言**:JPA引入了一种名为JPQL...

    jpa + hibernate 例子

    3. **持久化(Persistence)**: JPA提供了`EntityManager`接口来管理实体的生命周期,包括创建、读取、更新和删除(CRUD操作)。例如,`entityManager.persist(entity)`用来保存新实体,`entityManager.find(Entity....

    jpa中hibernate实现相关jar包

    在标题和描述中提到的"jpa中hibernate实现相关jar包"是指一组完整的Hibernate库,这些库可以帮助开发者在项目中集成JPA和Hibernate,实现对数据库的高效操作。 以下是一些关键的Hibernate JPA相关jar包及其作用: ...

    JPA(hibernate) Dao 和 DaoSupport

    在JPA和Hibernate中,DAO通常用于执行CRUD(创建、读取、更新、删除)操作。 **DaoSupport类:** 在Spring框架中,`DaoSupport`是一个抽象类,为DAO实现提供了一些基础支持,比如初始化和关闭数据库资源。继承自`...

    JPA-Hibernate包

    通过学习和熟练掌握JPA与Hibernate,开发者可以更高效地处理Java应用程序中的数据库操作,实现业务逻辑与数据存储的解耦,提高软件的可维护性和扩展性。在实际项目中,合理利用这两个框架的特性,能显著提升开发效率...

    搭建一个JPA+hibernate实例

    本教程将指导你如何搭建一个基于JPA和Hibernate的实例,以便在Java项目中进行数据库操作。 首先,理解JPA的核心概念至关重要。JPA提供了一套规范,允许开发者使用面向对象的编程方式来处理关系型数据库。它定义了...

    jpa_hibernate项目 所有jar包

    1. **配置**:理解和设置Hibernate和JPA的配置文件,如persistence.xml和hibernate.cfg.xml。 2. **实体映射**:学习如何通过注解或XML文件将Java类映射到数据库表。 3. **CRUD操作**:掌握基本的创建(Create)、...

    JPA + Hibernate 3 CRUD操作历史审计日志的解决方案

    在Java开发中,数据持久化是一个关键环节,而Java Persistence API (JPA) 和 Hibernate 是常用的ORM(对象关系映射)框架,它们简化了数据库操作。这篇文章将深入探讨如何使用JPA与Hibernate实现CRUD(创建、读取、...

    Hibernate's JPA.rar

    2. **实体管理器(EntityManager)**:是JPA的主要接口,负责处理实体的创建、读取、更新和删除操作。它提供了方法如`persist()`, `merge()`, `remove()` 和 `find()`。 3. **实体工厂(EntityManagerFactory)**:...

    JPA_Hibernate 4.3 jar包

    Hibernate提供了一种高效、灵活的方式来将Java对象映射到数据库表,并且提供了对数据库操作的高级抽象,比如查询语言HQL(Hibernate Query Language)和 Criteria API。 **Hibernate 4.3**是Hibernate的一个版本,...

    JPA 与hibernate所需jar包

    整合JPA与Hibernate使得开发者可以专注于业务逻辑,而不是底层数据库操作,同时,由于Hibernate的广泛使用和社区支持,遇到问题时通常能找到丰富的解决方案。正确配置和使用这两个工具,可以大大提高Java应用的开发...

    JPA教程,包括TOPLink JPA,Hibernate JPA,Open Jpa,jpa批注

    TOPLink JPA的优势在于其高性能和对复杂数据模型的良好支持,同时也能够无缝集成到EclipseLink(Oracle的开源持久化框架)中,提供了广泛的持久化服务。 **2. Hibernate JPA** Hibernate是最早的ORM框架之一,后来...

    JPA jar包(基于JPA的Hibernate实现)

    Hibernate 4.2是在JPA 2.1之前的一个版本,它引入了许多增强的功能和改进,包括支持JSR-310日期和时间API,改进了批处理操作,以及对Java 7的支持等。 **JPA的核心概念:** 1. **实体(Entity)**:代表数据库中的...

    hibernate-jpa.jar

    实体管理器则负责执行CRUD操作(创建、读取、更新和删除),并与数据库进行交互。实体管理工厂是创建实体管理器的工厂类,通常在应用初始化时创建并缓存,以提高性能。持久化上下文则保持了与数据库的一致性,管理...

    springboot利用jpa连接hibernate用法2

    通过以上步骤,我们可以构建一个功能完善的Spring Boot应用,利用JPA和Hibernate进行数据操作。这个过程中,Spring Boot的自动化配置极大地简化了开发流程,使得我们可以更专注于业务逻辑而不是底层的数据库操作。...

    jpa之使用hibernate示例代码

    6. **关联映射**:JPA允许定义实体之间的关联,如一对一(@OneToOne),一对多(@OneToMany),多对一(@ManyToOne)和多对多(@ManyToMany)。这些关联可以通过属性或集合进行映射。 7. **懒加载和即时加载**:...

    jpa+hibernate

    `JPA(Java Persistence API)`和`Hibernate`是Java开发中用于对象关系映射(ORM)的重要工具,它们在处理数据库操作时提供了便捷的编程模型。ORM允许开发者使用面向对象的方式操作数据库,减少了对SQL的直接依赖,...

    Hibernate JPA jar包

    - **会话(Session)**:在Hibernate JPA中,Session负责管理对象的生命周期,如保存、更新、删除和查询操作。它是与数据库交互的接口。 - **Repository(仓库)**:仓库接口是一种设计模式,用于提供对特定领域...

Global site tag (gtag.js) - Google Analytics