Hibernate cascade

本文详细介绍了Hibernate中实体之间的级联操作,包括级联持久化、级联删除、级联合并及级联刷新等机制。通过示例展示了如何在实体间进行级联操作,以及这些操作在实际应用中的利弊。

1. 域模型与元数据

  • 域模型:创建实体的及其属性的概念模型叫域模型

  • 元数据选项:Hibernate持久化类及其属性与数据库表和列关联的方法

2. 映射持久化

  • 细粒度域模型:hibernate支持细粒度的富域模型,这是使用POJO的原因,简单来说,细粒度意味着类比表要多
  • 实体和值类型:@Entity和@Id注解映射一个持久化类,实体属性映射响应的值类型

3. 级联状态

如果可以跨越到另一个实体的关联来级联实体状态的状态变更,就只需要较少的代码来管理关系。细粒度控制有时对于表达关联实体之间的依赖性是必须的,JPA中用于此的机制是cascade的选项。

3.1 CascadeType.Persist

级联选项要用于想要传递的每个操作,因此要将CascadeType.PERSIST用于EntityManager#persist()操作。可以在简化item和bid保存它们的代码。

@Entity
public class Item {

    @Id
    @GeneratedValue(generator = Constants.ID_GENERATOR)
    protected Long id;

    protected String name;

    @OneToMany(mappedBy = "item", cascade = CascadeType.PERSIST)
    protected Set<Bid> bids = new HashSet<>();

    // ...
}

@Entity
public class Bid {

    @Id
    @GeneratedValue(generator = Constants.ID_GENERATOR)
    protected Long id;

    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    protected Item item;
}
//持久化
EntityManager em = JPA.createEntityManager();

Item someItem = new Item("Some Item");
em.persist(someItem); // Saves the bids automatically (later, at flush time)

Bid someBid = new Bid(new BigDecimal("123.00"), someItem);
someItem.getBids().add(someBid);

Bid secondBid = new Bid(new BigDecimal("456.00"), someItem);
someItem.getBids().add(secondBid);
tx.commit(); // Dirty checking, SQL execution
em.close();

在提交时,Hibernate会检查管理/持久化的Item实例并检查bids集合,之后会从内部在每个引用的Bid实例上调用persist()并且保存它们。

3.2 级联删除

在当前级联选项中,首先要移除Bid,在移除所有者Item,在@OneToMany注解上启用级联选项CascadeType.REMOVE后,持久化引擎可以自动移除关联的实体实例

 em = JPA.createEntityManager();

 Item item = em.find(Item.class, ITEM_ID);
 assertEquals(item.getBids().size(), 2);

 for (Bid bid : item.getBids()) {
    em.remove(bid);
 }
em.remove(item);



//启用CascadeType.REMOVE后
Item item = em.find(Item.class, ITEM_ID);
em.remove(item); 

删除需要加载该集合,因为每个Bid都是独立的实体实例,并且必须经历常规的生命周期。这一删除过程是低效的

3.3 级联合并(新增或修改)

CascadeType.MERGE:若Bid属性修改了,那么Item对象保存时同时修改items里的对象,对应EntityManager的merge方法 。

3.4 级联刷新

CascadeType.REFRESH:获取Item对象里也同时也重新获取最新的Bid的对象。对应EntityManager的refresh(object)方法有效。即会重新查询数据库里的最新数据。

4. 总结

新增和删除在项目中有部分使用场景,在删除时可以简化较多代码,但是数据关系复杂后带来的是数据量较大时的效率问题,关联关系会在数据库生成外键影响效率,有一个先从数据库获取数据,之后才能更新数据库数据,效率较低,要解决这里问题一个是深入研究Hibernate的内部机制提高效率,另一个是转向mybatis,提高灵活性。

内容概要:本文介绍了一个基于Matlab的综合能源系统优化调度仿真资源,重点实现了含光热电站、有机朗肯循环(ORC)和电含光热电站、有机有机朗肯循环、P2G的综合能源优化调度(Matlab代码实现)转气(P2G)技术的冷、热、电多能互补系统的优化调度模型。该模型充分考虑多种能源形式的协同转换与利用,通过Matlab代码构建系统架构、设定约束条件并求解优化目标,旨在提升综合能源系统的运行效率与经济性,同时兼顾灵活性供需不确定性下的储能优化配置问题。文中还提到了相关仿真技术支持,如YALMIP工具包的应用,适用于复杂能源系统的建模与求解。; 适合人群:具备一定Matlab编程基础和能源系统背景知识的科研人员、研究生及工程技术人员,尤其适合从事综合能源系统、可再生能源利用、电力系统优化等方向的研究者。; 使用场景及目标:①研究含光热、ORC和P2G的多能系统协调调度机制;②开展考虑不确定性的储能优化配置与经济调度仿真;③学习Matlab在能源系统优化中的建模与求解方法,复现高水平论文(如EI期刊)中的算法案例。; 阅读建议:建议读者结合文档提供的网盘资源,下载完整代码和案例文件,按照目录顺序逐步学习,重点关注模型构建逻辑、约束设置与求解器调用方式,并通过修改参数进行仿真实验,加深对综合能源系统优化调度的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值