在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的要求必须得这样做,不能替我们自动完成一些东西,是利于安全。这可能就是标准和流行的差别吧。呵
呵。
分享到:
相关推荐
2. **JPA的API**:提供了用于操作实体对象的一系列API,包括创建、读取、更新和删除(CRUD)操作。这些API使得开发者无需编写复杂的JDBC和SQL代码即可实现数据的持久化。 3. **查询语言**:JPA引入了一种名为JPQL...
3. **持久化(Persistence)**: JPA提供了`EntityManager`接口来管理实体的生命周期,包括创建、读取、更新和删除(CRUD操作)。例如,`entityManager.persist(entity)`用来保存新实体,`entityManager.find(Entity....
在标题和描述中提到的"jpa中hibernate实现相关jar包"是指一组完整的Hibernate库,这些库可以帮助开发者在项目中集成JPA和Hibernate,实现对数据库的高效操作。 以下是一些关键的Hibernate JPA相关jar包及其作用: ...
在JPA和Hibernate中,DAO通常用于执行CRUD(创建、读取、更新、删除)操作。 **DaoSupport类:** 在Spring框架中,`DaoSupport`是一个抽象类,为DAO实现提供了一些基础支持,比如初始化和关闭数据库资源。继承自`...
通过学习和熟练掌握JPA与Hibernate,开发者可以更高效地处理Java应用程序中的数据库操作,实现业务逻辑与数据存储的解耦,提高软件的可维护性和扩展性。在实际项目中,合理利用这两个框架的特性,能显著提升开发效率...
本教程将指导你如何搭建一个基于JPA和Hibernate的实例,以便在Java项目中进行数据库操作。 首先,理解JPA的核心概念至关重要。JPA提供了一套规范,允许开发者使用面向对象的编程方式来处理关系型数据库。它定义了...
1. **配置**:理解和设置Hibernate和JPA的配置文件,如persistence.xml和hibernate.cfg.xml。 2. **实体映射**:学习如何通过注解或XML文件将Java类映射到数据库表。 3. **CRUD操作**:掌握基本的创建(Create)、...
在Java开发中,数据持久化是一个关键环节,而Java Persistence API (JPA) 和 Hibernate 是常用的ORM(对象关系映射)框架,它们简化了数据库操作。这篇文章将深入探讨如何使用JPA与Hibernate实现CRUD(创建、读取、...
2. **实体管理器(EntityManager)**:是JPA的主要接口,负责处理实体的创建、读取、更新和删除操作。它提供了方法如`persist()`, `merge()`, `remove()` 和 `find()`。 3. **实体工厂(EntityManagerFactory)**:...
Hibernate提供了一种高效、灵活的方式来将Java对象映射到数据库表,并且提供了对数据库操作的高级抽象,比如查询语言HQL(Hibernate Query Language)和 Criteria API。 **Hibernate 4.3**是Hibernate的一个版本,...
整合JPA与Hibernate使得开发者可以专注于业务逻辑,而不是底层数据库操作,同时,由于Hibernate的广泛使用和社区支持,遇到问题时通常能找到丰富的解决方案。正确配置和使用这两个工具,可以大大提高Java应用的开发...
TOPLink JPA的优势在于其高性能和对复杂数据模型的良好支持,同时也能够无缝集成到EclipseLink(Oracle的开源持久化框架)中,提供了广泛的持久化服务。 **2. Hibernate JPA** Hibernate是最早的ORM框架之一,后来...
Hibernate 4.2是在JPA 2.1之前的一个版本,它引入了许多增强的功能和改进,包括支持JSR-310日期和时间API,改进了批处理操作,以及对Java 7的支持等。 **JPA的核心概念:** 1. **实体(Entity)**:代表数据库中的...
实体管理器则负责执行CRUD操作(创建、读取、更新和删除),并与数据库进行交互。实体管理工厂是创建实体管理器的工厂类,通常在应用初始化时创建并缓存,以提高性能。持久化上下文则保持了与数据库的一致性,管理...
通过以上步骤,我们可以构建一个功能完善的Spring Boot应用,利用JPA和Hibernate进行数据操作。这个过程中,Spring Boot的自动化配置极大地简化了开发流程,使得我们可以更专注于业务逻辑而不是底层的数据库操作。...
6. **关联映射**:JPA允许定义实体之间的关联,如一对一(@OneToOne),一对多(@OneToMany),多对一(@ManyToOne)和多对多(@ManyToMany)。这些关联可以通过属性或集合进行映射。 7. **懒加载和即时加载**:...
`JPA(Java Persistence API)`和`Hibernate`是Java开发中用于对象关系映射(ORM)的重要工具,它们在处理数据库操作时提供了便捷的编程模型。ORM允许开发者使用面向对象的方式操作数据库,减少了对SQL的直接依赖,...
- **会话(Session)**:在Hibernate JPA中,Session负责管理对象的生命周期,如保存、更新、删除和查询操作。它是与数据库交互的接口。 - **Repository(仓库)**:仓库接口是一种设计模式,用于提供对特定领域...