在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的要求必须得这样做,不能替我们自动完成一些东西,是利于安全。这可能就是标准和流行的差别吧。呵
呵。
分享到:
相关推荐
springboot利用jpa连接hibernate,并进行生成表,对表的增加,删除,查询操作
springboot利用jpa连接hibernate,并进行生成表,对表的增加,删除,查询操作用法2
Spring Boot JPAHibernate查询方法 Spring Data JPA是提供各种API来执行CRUD操作的Spring Data模块之一.Spring Data JPA主要用于存储库层的开发。 在Spring Data中,我们可以定义存储库接口和方法来检索数据。 所有...
JpaMapper是尽量按照JPA hibernate的书写风格,对mybatis进行封装,是CRUD操作更加简单易用,免于不断写sql。以动态生成sql替换手动生成sql的过程,并根据注解生成sqlsource的过程去生成sql,并将sql交给mybatis去...
Spring Boot Data Jpa Example ...spring.jpa.hibernate.ddl-auto: validate 启动时校验实体和表结构是否一致, 数据结构稳定时采用这个 spring.jpa.hibernate.ddl-auto: none 不采取任何措施 Jpa 常用操作
该项目演示了如何使用 Hibernate 和 Spring 框架在 SQL 服务器数据库中进行数据操作(插入、选择、更新和删除)(您可以使用资源文件下的 applicationContext.xml 文件中的 datasource 属性切换任何其他关系数据库...
Hibernate 可以对类的属性或者方法进行注解。属性对应field类别,方法的 getXxx()对应property类别。 定义表 通过 @Table 为实体Bean指定对应数据库表,目录和schema的名字。 @Entity @Table(name="tbl_sky") ...
使用Spring,Hibernate,JPA设计的RESTful CRUD应用程序:用于处理车辆库存和搜索。 基本要求: 车辆可以是具有特定属性和行为的不同类型。 类型:汽车,卡车,飞机,摩托车等 CRUD操作以管理车辆 保存到本地数据库...
支持JPA:继承hibernate的便捷操作和mybatis的sql集中编写or管理;支持乐观锁 *.支持多层次缓存:本地一级缓存,本地全局二级缓存,远程缓存,查询缓存,方法级别缓存 *.支持缓存融入事务,业务异常不提交缓存数据 *...
JPA(Java Persistence API):一个用于操作数据库的Java API,可以简化数据库操作的代码。 Hibernate:一个JPA实现,用于将Java对象映射到数据库表。 Bootstrap:一个前端框架,用于快速构建响应式和移动优先的Web...
我们将使用 Spring Data JPA 来管理数据持久性,并且使用 Hibernate 作为我们的 ORM 框架。 我们还将实现一个基本的用户界面,让用户能够轻松地浏览和操作图书。这个界面将包括一个搜索栏,让用户能够按照关键字...
20.7.2 定义对宠物商品信息进行数据库操作的业务逻辑类ThingsBuy 370 20.8 显示宠物新闻模块的实现 373 20.8.1 对应宠物新闻的实体类News 374 20.8.2 定义对宠物新闻进行数据库操作的业务逻辑类NewsBuy 374 20.8.3 ...
遗留的erp 传统ERP是一个简单的Java...: 添加用于创建员工的验证处理添加验证处理以更新员工添加数据填充服务添加部门和经理添加部门分配选项以进行员工更新操作添加更新和删除部门控制器创建部门视图,并有员工人数
109.jpa 和 hibernate 有什么区别? 110.什么是 spring cloud? 111.spring cloud 断路器的作用是什么? 112.spring cloud 的核心组件有哪些? 十二、Hibernate 113.为什么要使用 hibernate? 114.什么是 ORM 框架?...
支持JPA,既有hibernate的便捷操作,又有mybatis的sql集中编写or管理的风格;支持乐观锁 *.支持防缓存穿透,防缓存击穿,防缓存雪崩 *.支持多层次缓存:本地一级缓存,本地全局二级缓存,远程缓存,查询缓存,方法...
javaee 实验报告 实验一 JSP+Servlet+Javabean+jdbc-基于MVC模式的数据库的应用 实验二 JSF+JPA实现用户注册 实验三 struts+spring+hibernate框架访问数据库的应用 实验四 使用WebService和EJBean访问数据库的应用
使用的技术: 弹簧靴拖曳MySQL的带有异步驱动程序的mongoDb 带有Hibernate的JPA 2.1 infinispan缓存(也许是最快的网格缓存) jpa数据休息(将数据库直接休息,非常方便快捷) 在infinispan上的spring缓存包装器...
2、后台:SpringMvc、Spring、Hibernate(持久层框架)、JPA、MD5加密、Spring Boot、 log4J日志框架、jstl、jstl自定义分页标签等 3、项目管理工具:Maven 4、数据库:Mysql 5、服务器:Tomcat 项目开发涉及功能: ...
Elide支持两种API变体: 用于读取和操作模型的CRUD(创建,读取,更新,删除)API。 用于汇总零个或多个模型属性的度量的分析API。 Elide支持许多功能:安全成为标准通过声明性的直观权限语法控制对字段和实体的...