求助,Hibernate级联加载该如何配置怎样才能荡的更高更高

他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Access denied | www.supmen.com used Cloudflare to restrict access
Please enable cookies.
What happened?
The owner of this website (www.supmen.com) has banned your access based on your browser's signature (3eccfe-ua98).所有回答(3)
怎么你的类注解的写法和我学的写法格式不一样呢。 这样写也能建立类与数据库的映射关系吗
默认的不就是级联查询么?(hibernate中也叫对象导航查询),只需要配好关系映射,里面的对象可以自动获取到,不过默认是懒加载的!
@ManyToMany这个注解不就是做这个 工作的吗??? 你可以认为拿到User的是已经拿到了role的list 只不过hibernate默认延时加载 只有当你调用role list的时候才会再访问一次数据库拿数据
清除回答草稿
&&&您需要以后才能回答,未注册用户请先。博客分类:
hibernate annotation一对多的级联删除,这个问题应该困扰了很多人吧,我也是被困扰了很久,为什么hibernate没有帮我们级联删除呢。
今天终于解决这个问题,下面给个例子大家,一定是可以级联删除的,之前在网上看了很多例子都无法做到,现在总结一下,给自己和给大家一点帮助。
annotation比xml的配置方便,却总感觉没有xml的功能强大。
用annotation的例子如下:
一个产品类型可以对多个产品,所以产品类型对产品的关系式一对多,产品类型的类如下:
import java.util.ArrayL
import java.util.L
import org.hibernate.annotations.C
//这里一定要用hibernate的annotation,不能用javax.persistence的
import org.hibernate.annotations.CascadeT
import javax.persistence.E
import javax.persistence.*;
import javax.persistence.T
import cn.com.dee.common.domain.DomainO
import cn.com.dee.dot.ProductTypeI
* 产品分类
* @author Dee
@Table(name = "RuixinPRODUCTTYPE")
public class ProductType implements DomainObject {
private static final long serialVersionUID = 2821257L;
private List&Product& products = new ArrayList&Product&();
//用于级联删除
public ProductType(){
public ProductType(ProductTypeInfo productTypeInfo) {
this.update(productTypeInfo);
public void update(ProductTypeInfo productTypeInfo){
this.code = productTypeInfo.getCode();
this.name = productTypeInfo.getName();
this.country = productTypeInfo.getCountry();
@Column(name = "ID", columnDefinition = "INT")
@GeneratedValue()
public String getId() {
@Column(name = "CODE", columnDefinition = "VARCHAR(40)")
public String getCode() {
@Column(name = "NAME", columnDefinition = "VARCHAR(50)")
public String getName() {
@Column(name = "COUNTRY", columnDefinition = "VARCHAR(50)")
public String getCountry() {
* 用于hibernate级联删除,删除了产品类型,把它下面的所有产品都一起删除
@OneToMany(targetEntity = Product.class,fetch = FetchType.LAZY)
@JoinColumn(name = "type")
@Cascade(value = {CascadeType.SAVE_UPDATE,
CascadeType.DELETE_ORPHAN,CascadeType.ALL})
public List&Product& getProducts() {
public void setCountry(String country) {
this.country =
public void setCode(String code) {
this.code =
public void setId(String id) {
public void setName(String name) {
this.name =
public void setProducts(List&Product& products) {
this.products =
产品的类如下:
import javax.persistence.C
import javax.persistence.E
import javax.persistence.GeneratedV
import javax.persistence.Id;
import javax.persistence.JoinC
import javax.persistence.ManyToO
import javax.persistence.T
import org.apache.commons.logging.L
import org.apache.commons.logging.LogF
import cn.com.dee.common.domain.DomainO
import cn.com.dee.dot.ProductI
* @author Ken
@Table(name = "RuixinPRODUCT")
public class Product implements DomainObject {
private static final long serialVersionUID = -0726153L;
private static final Log logger = LogFactory.getLog(Product.class);
* 产品全称
private String fullN
* 产品类型
private ProductT
//关联产品类型那边
// get方法
@Column(name = "ID", columnDefinition = "INT")
@GeneratedValue()
public String getId() {
//多对一对应product_type数据库里面的主码id
@ManyToOne
@JoinColumn(name = "TYPE", referencedColumnName = "ID", unique = false)
public ProductType getType() {
// set方法
public void setId(String id) {
public void setType(ProductType type) {
this.type =
调用hibernate底层的删除方法如下,只有调用这个方法才可以级联删除,自己写的sql语句是不能级联删除的:
public void delete(O object) {
//把产品类型的对象传进来
this.getHibernateTemplate().delete(object);
在service层的删除方法可以这样写:
* 删除产品类型,同时也删除该类型下面的产品
public void delete(ProductTypeInfo typeInfo) {
//把ProductTypeInfo转换为ProductType
ProductType type = new ProductType();
type.setId(typeInfo.getId());
type.setCode(typeInfo.getCode());
type.setCountry(typeInfo.getCountry());
type.setName(typeInfo.getName());
productTypeRepository.delete(type);
//调用hibernate底层的delete方法删除产品类型
到这里就大功告成!快去尝试一下吧,级联删除解决了,其他要怎么设计数据库,设计外键你都可以放心去做了,不会被这个搞到如此痛苦。
请问下楼主。为什么不能用JPA的annotation而要用hibernate的??我查了一下jpa的api,貌似没有关于级联删除的参数,不知道这种解释对不对,不过用了hibernate的annotation就可以了
浏览: 11216 次
来自: 广州
太感谢了,解决困扰我一个星期的问题,特意登录上来标识感谢!
&div class=&quote_title ...
请问下楼主。为什么不能用JPA的annotation而要用hi ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'今天特别的记录一句话,或者说记录一下编程体会。昨天和一老师讨论hibernate数据库的问题,老师说这个问题我也不会。咱两可以讨论研究一下。讨论结束后,老师说今天我们又对hibernate有了新的认识又深入了一点。然后我突然想到,看书上课学到的知识几乎忘的一干二净。记住的都是自己遇到的bug,和解决bug的技术知识。看来发现问题和解决问题才是最好的老师,而记录问题和解决方法就是对这个过程的最好总结和知识积累。
还是老套路,说一下遇到延迟加载和级联删除的背景。
在一个正在做的项目开发中,DAO层获取到数据对象,而在Action层处理业务逻辑的时候object.getXXX。突然发现报错:no-Session。当时就蒙了,以为是HttpSession,一细看是hibernate的报错信息。百度一通后发现。有一个东西叫做hibernate延迟加载。打开hibernate映射配置文件,hbm.xml集合属性默认lazy=true。也就是说,hibernate默认延迟加载了set属性。而当我从DAO层返回数据对象后,关闭了session。set属性对象并没有被加载到内存中去,所以报错。
为什么要出现延迟加载这个东西呢!一个持久化对象如果存在好几个set属性集合,一次查询又有几百万条记录,那么一次性直接加载到内存是十分悲剧的一件事情。而很多时间,我们很有可能只需要得到一个属性或者字段的值。那么此时将造成极大的浪费。而延迟加载就是对这种情况的优化方案。当然有时是没有必要的,lazy=false就ok了!
当出现多对一的关系的时候往往出现外键约束,那么在删除一的方的时候往往因为外键约束而不能正常删除。那么就需要先删除多的一方解除此约束,然后再删除一的一方。显然手动的处理是相当麻烦的一件事情。所以一般情况下数据库都为我们提供了级联删除的功能。不同的数据库配置或者定义级联删除的操作不一定相同,不再赘述。因为这种配置或者定义不同所以存在一定的可移植性问题。所以最好能在hibernate层处理,那么在hibernate中是怎么处理的呢?很简单在many-to-one里设置 cascade=“delete”,当然cascade是有四个值的update save delete 和all。视情况选择恰当的值操作。
需要注意的是,在使用hibernate级联删除的时候必须使用对象删除,使用HQL语句删除是达不到效果的。因为只有使用到持久化对象才会加载配置文件,从而读取到级联删除的配置。而HQL在删除操作的时候是不使用持久化对象,而是翻译成sql执行的!
阅读(...) 评论()

我要回帖

更多关于 怎么样才能跳的更高 的文章

 

随机推荐