Hibernate cascade

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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,提高灵活性。

内容概要:文章详细介绍了电梯门禁(梯控)系统的硬件安装与接线要点。首先强调了梯控板与楼层按键对接的重要性,包括遵循一一对应原则以避免错层、越层问题,允许空层存在以适应实际需求。接着阐述了不同接线方式(COM、NO、NC端口的不同组合)对用户权限的影响,如单层权限用户刷卡直达指定楼层,多层权限用户在特定接线方式下的操作限制。硬件安装方面,强调了无源干触点设计原则以确保电气隔离,防止系统间干扰,以及读卡器接入时的规范要求。文章还介绍了梯控系统的技术原理,如身份验证机制(二维码/IC卡/人脸识别)、消防联动功能(紧急情况下释放所有楼层权限),并指出该系统适用于小区、写字楼等场景,支持机器人乘梯SDK扩展。最后,根据不同场景需求提出了适用的接线方式选择,如严格管控场景下选择4.3接线以实现精准权限控制,限制多层用户手动选层场景下选择4.1接线并配合软件权限设置。; 适合人群:从事电梯安装维护的技术人员、楼宇自动化工程师及相关领域的管理人员。; 使用场景及目标:①指导技术人员正确安装和接线梯控系统,确保系统安全稳定运行;②帮助管理人员了解不同接线方式对用户权限的影响,以便根据实际需求选择合适的配置方案;③提升楼宇安全管理和服务质量,特别是在小区、写字楼等场所的应用。; 其他说明:梯控系统的正确安装和接线不仅关系到系统的正常运作,更直接影响到用户的安全和使用体验。因此,在实际操作中务必严格按照规范执行,同时关注最新的技术发展和应用场景变化,以确保系统始终处于最佳状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值