标签: cascade

外键级联多路径和周期有什么问题?

在MSSQL 2005中,我刚刚发现臭名昭着的错误消息:

在表YYY上引入FOREIGN KEY约束XXX可能会导致循环或多个级联路径.指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束.

现在,StackOverflow有关于此错误消息的几个主题,所以我已经得到了解决方案(在我的情况下我将不得不使用触发器),但我很好奇为什么会出现这样的问题.

据我了解,他们基本上有两种情况需要避免 - 一个循环和多个路径.一个循环是两个表彼此级联外键的地方.好的,一个循环也可以跨越几个表,但这是基本情况,并且更容易分析.

当TableA具有TableB和TableC的外键时,将有多个路径,TableB也具有TableC的外键.再次 - 这是最基本的案例.

当在任何这些表中删除或更新记录时,我看不到任何问题.当然,您可能需要多次查询同一个表以查看哪些记录需要更新/删除,但这真的是一个问题吗?这是性能问题吗?

在其他SO主题中,人们甚至将使用级联标记为" 有风险 ",并声明" 解决级联路径是一个复杂的问题 ".为什么?风险在哪里?问题出在哪儿?

sql cascade foreign-keys rdbms-agnostic

18
推荐指数
1
解决办法
9255
查看次数

如何在hibernate中的多对一映射上定义反级联删除

我有两个类A和B.许多B可以与单个A关联,因此从B到A的多对一关系.我已经映射了这样的关系:

<class name="A" table="tbl_A">
  <property name="propA" column="colA"/>
</class>
<class name="B" table="tbl_B">
  <property name="propB" column="colB"/>
  <many-to-one name="a" class="A" column="col1" cascade="delete"/>
</class>
Run Code Online (Sandbox Code Playgroud)

A没有任何映射到B.记住这一点,我们打算在删除关联A时删除B. 如果我可以在B中的多对一关联上定义inverse ="true",那么这可能是可能的,但是hibernate不允许这样做.

有人能帮忙吗?我们不想为此写任何东西.

java orm hibernate cascade

18
推荐指数
2
解决办法
3万
查看次数

依赖外键级联是不是很糟糕?

我参与的项目的首席开发人员表示依靠级联删除相关行是不好的做法.

我不知道这有多糟糕,但我想知道你对它是否/为什么的看法.

mysql sql database-design cascade

16
推荐指数
4
解决办法
7115
查看次数

WillCascadeOnDelete在实体框架中如何工作?

据我了解,如果我删除父行,如果我在删除时打开级联,则应删除其子项.但是,根据我的测试,它似乎根本不起作用.无论我将WillCascaseOnDelete设置为true还是false,它只是将其子项的外键设置为null.这导致另一个问题,我必须将外键设置为可空,否则,SaveChange将抛出异常.这是缺陷还是期望的行为?

entity-framework cascade

16
推荐指数
1
解决办法
2万
查看次数

如何正确级联删除Core Data中的托管对象?

我有一个核心数据模型,它有三个实体:A,B和C.A与B有一对多的关系,B与C有多对多的关系.A的删除规则 - > B是"Cascade",B - > A是"No Action".B - > C的删除规则是"No Action",C - > B是"Deny".

我在A实体上执行删除时遇到问题.我想要发生的是以下内容:

  1. 我删除了一个A的实例(使用deleteObject:)
  2. 删除传播到与A关联的任何B(由于"级联"删除规则)
  3. 与A关联的所有B都将被删除
  4. 属于C的任何关系,其关联的B被删除,也被删除

这可能有点令人困惑,所以让我解释一下:当删除A时,删除所有关联的B.任何引用那些B的C都不能再引用它们了.

在我的测试中,我没有看到"Cascade"删除规则对我起作用.当我删除A时,我会processPendingChanges立即调用(只是为了确保删除已完成).然后我比较删除之前和之后NSManagedObjectContext中A和B的数量.A的实例已被正确删除,(总A的数量现在比删除前少一个).但是,B的数量保持不变.因此,似乎没有尊重"级联"删除规则.

我知道我可以手动完成A - > B关系,并手动删除每个B.然而,看起来这是Core Data免费提供的东西,所以除非Core Data不足,否则我不想这样做.有关使用"级联"删除规则的任何信息都是受欢迎的.

cocoa cascade core-data data-modeling

15
推荐指数
1
解决办法
1万
查看次数

如何在Symfony2 Doctrine中使用级联选项?

我试图理解Symfony2cascadeDoctrine中的选项.

我希望能够删除子实体(而不是触发外键约束错误.)

我有3个实体:

报告

/**
* @ORM\OneToMany(targetEntity="Response", mappedBy="report")
*/
protected $responses;

/**
* @ORM\OneToMany(targetEntity="Response", mappedBy="report")
*/
protected $sms;
Run Code Online (Sandbox Code Playgroud)

响应

/**
 * @ORM\ManyToOne(targetEntity="Report", inversedBy="responses")
 */
protected $report;
Run Code Online (Sandbox Code Playgroud)

短信

/**
 * @ORM\ManyToOne(targetEntity="Report")
 */
protected $report;
Run Code Online (Sandbox Code Playgroud)

现在我想删除一个Response实体,但我得到了

SQLSTATE [23000]:完整性约束违规:1451无法删除或更新父行:
外键约束失败(mybundle.sms,CONSTRAINT FK_B0A93A77BB333E0DFOREIGN KEY(reportId)REFERENCES report(id))

我在哪里使用该cascade选项以及我应该使用哪个选项(detachremove)?

我可以做很多试验和错误来解决这个问题,但我希望得到专家的解释,所以我不会忽视某些事情.

doctrine cascade

15
推荐指数
2
解决办法
3万
查看次数

已分离的实体传递给持久性错误

我在提交表单时收到此错误:

org.hibernate.PersistentObjectException:传递给persist的分离实体:com.project.pmet.model.Account; 嵌套异常是javax.persistence.PersistenceException:org.hibernate.PersistentObjectException:传递给persist的分离实体:com.project.pmet.model.Account

这是我的实体:

帐户:

@Entity
@DynamicInsert
@DynamicUpdate
public class Account {

    @Id
    @GeneratedValue
    private Integer id;

    @Column(nullable = false)
    private String login;

    @Column(nullable = false)
    private String password;

    @Column(nullable = false)
    private String email;

    @ManyToOne
    @JoinColumn(name = "team_id")
    private Team team;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "owner")
    private List<Team> ownedTeams;

    ...
Run Code Online (Sandbox Code Playgroud)

球队:

@Entity
@DynamicInsert
@DynamicUpdate
public class Team {

    @Id
    @GeneratedValue
    private Integer id;

    @Column(nullable = false)
    private String name;

    @ManyToOne
    @JoinColumn(name = "owner_id", nullable = false)
    private Account …
Run Code Online (Sandbox Code Playgroud)

java spring hibernate cascade persistent

15
推荐指数
4
解决办法
4万
查看次数

JPA和Hibernate级联之间的混淆

我正在使用Hibernate 3.6并对我的代码进行了注释(与使用hibernate映射文件相比).我遇到了使用与Hibernate的CascadeType不兼容的JPA级联选项的已知"问题"(有关详细信息,请参阅此链接http://www.mkyong.com/hibernate/cascade-jpa-hibernate-annotation-common-mistake /).

我希望能对这个问题有一点澄清.我有一些特别的问题:

1)所以@Cascade({CascadeType.SAVE_UPDATE})适用于saveOrUpdate(),但如果我使用merge()或persist(),它是否也适用?或者我必须使用所有三种Hibernate CascadeTypes?

2)如何决定是使用JPA级联选项还是使用Hibernate @Cascade注释?

2)在Hibernate中存在针对此问题的"bug",但开发人员显然将此视为文档问题(我完全不同意这些问题),并且我没有看到它在所述文档中得到解决.任何人都知道为什么这是"按设计工作"而不是Hibernate的JPA实现中的错误?

提前谢谢了.

hibernate jpa cascade

14
推荐指数
1
解决办法
2万
查看次数

Hibernate:如何在注释中使用级联?

如何在休眠中使用级联和注释?

但我怀疑:

我有这种情况:

public class Package(){
  @OneToOne(cascade=CascadeType.PERSIST)
  private Product product;

  @OneToOne(cascade=CascadeType.PERSIST)
  private User user;
  ..
}
Run Code Online (Sandbox Code Playgroud)

当我尝试时session.save(package),会发生错误.我不想保存产品和包装.我只想初始化并将它们设置到我的包对象中.

那可能吗?

java hibernate cascade

14
推荐指数
1
解决办法
6万
查看次数

EF Core - 为什么 ClientSetNull 是可选关系的默认 OnDelete 行为(而不是 SetNull)

对于可选关系(当外键可以接受时Null),ClientSetNull自 EF Core 2.0 以来引入了一个新行为作为删除行为的默认选项DeleteBehavior.ClientSetNull。这具有SetNull跟踪实体的语义和Restrict未加载到内存中的数据库记录的(无操作)行为。

级联删除行为

微软文档说:

如果您希望数据库即使在未加载子实体时也尝试将空值传播到子外键,请使用 SetNull. 但是,请注意,数据库必须支持这一点,并且像这样配置数据库可能会导致其他限制,这在实践中通常会使此选项不切实际。这就是 SetNull 不是默认设置的原因。

但我认为,当关联的父实体被删除(db 中的每个地方)时,将依赖实体的 FK 设置为 Null 通常是正常的。而且,如上所述的那些“其他限制,这在实践中经常使这个选项不切实际......”是什么?

cascade entity-framework-core ef-core-2.0

14
推荐指数
1
解决办法
6482
查看次数