微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

级联会在1笔交易中发生吗?

如何解决级联会在1笔交易中发生吗?

我保存了产品,该产品会级联保留productMaterial。但是,当productMaterial抛出DataIntegrityViolationException时,该产品将被回滚,这似乎是在1次事务中完成了级联,但是我找不到任何文档说这样做。有人可以帮我澄清一下吗?

注意:我请勿使用@Transactional

Material material = new Material();
material.setId(1);

Product newProduct = new Product();
ProductMaterial productMaterial = new ProductMaterial();

newProduct.setName("bàn chải");
newProduct.setPrice(1000);
newProduct.setCreatedAt(new Date());
newProduct.setProductMaterials(Collections.singletonList(productMaterial));

productMaterial.setProduct(newProduct);
productMaterial.setMaterial(material);

productRepository.save(newProduct);

这是休眠执行:

Hibernate: 
    /* insert com.vietnam.hanghandmade.entities.Product
        */ insert 
        into
            product
            (created_at,name,price,id) 
        values
            (?,?,?)
2020-11-10 14:55:38.281 TRACE 65729 --- [nio-8080-exec-2] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [TIMESTAMP] - [Tue Nov 10 14:55:38 JST 2020]
2020-11-10 14:55:38.281 TRACE 65729 --- [nio-8080-exec-2] o.h.type.descriptor.sql.BasicBinder      : binding parameter [2] as [VARCHAR] - [bàn chải]
2020-11-10 14:55:38.281 TRACE 65729 --- [nio-8080-exec-2] o.h.type.descriptor.sql.BasicBinder      : binding parameter [3] as [INTEGER] - [1000]
2020-11-10 14:55:38.281 TRACE 65729 --- [nio-8080-exec-2] o.h.type.descriptor.sql.BasicBinder      : binding parameter [4] as [OTHER] - [e5729490-a0f8-48e7-9600-eeeba8b8f279]
Hibernate: 
    /* insert com.vietnam.hanghandmade.entities.ProductMaterial
        */ insert 
        into
            product_material
            (material_id,product_id) 
        values
            (?,?)
2020-11-10 14:55:38.324 TRACE 65729 --- [nio-8080-exec-2] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [INTEGER] - [1]
2020-11-10 14:55:38.324 TRACE 65729 --- [nio-8080-exec-2] o.h.type.descriptor.sql.BasicBinder      : binding parameter [2] as [OTHER] - [e5729490-a0f8-48e7-9600-eeeba8b8f279]
2020-11-10 14:55:38.328  WARN 65729 --- [nio-8080-exec-2] o.h.engine.jdbc.spi.sqlExceptionHelper   : sql Error: 0,sqlState: 23503
2020-11-10 14:55:38.328 ERROR 65729 --- [nio-8080-exec-2] o.h.engine.jdbc.spi.sqlExceptionHelper   : ERROR: insert or update on table "product_material" violates foreign key constraint "product_material_material_id_fkey"
  Detail: Key (material_id)=(1) is not present in table "material".

解决方法

注意::该答案没有回答问题的要点,即“级联持久” –涉及外键的“级联删除”。

级联删除或更新是实现外键约束的系统触发器的一部分,因此它与触发语句在同一事务中运行。

我在精细的手册中找不到能说明这一点的地方,但是如果您考虑一下,这是显而易见的:如果级联删除是在单独的事务中运行的,则删除成功且级联删除很可能失败,这将导致数据库不一致,因此不是一种选择。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。