什么是级联的NHibernate的是什么意思?
我在级联中看到了很多选项:
你能用例子及其区别来解释这些吗?
我想知道这个测试问题.我自己准备了这个例子并进行了测试,但我仍然不确定答案.
具有以下内容:
CREATE TABLE foo (
id INT PRIMARY KEY AUTO_INCREMENT,
name INT
)
CREATE TABLE foo2 (
id INT PRIMARY KEY AUTO_INCREMENT,
foo_id INT REFERENCES foo(id) ON DELETE CASCADE
)
Run Code Online (Sandbox Code Playgroud)
据我所知,答案是:
一个.创建了两个表
虽然也有:
湾 如果删除表foo2中foo_id为2的行,则会自动删除表foo中id = 2的行
d.如果删除表foo中id = 2的行,则删除表foo2中foo_id = 2的所有行
在我的例子中,我会使用删除语法:
DELETE FROM foo WHERE id = 2;
DELETE FROM foo2 WHERE foo_id = 2;
Run Code Online (Sandbox Code Playgroud)
出于某种原因,我无法找到表格之间的任何关系,尽管看起来应该有一个.也许有一些MySQL设置或者可能ON DELETE CASCADE在表创建查询中没有正确使用?我不知道......
任何人都可以提供这些功能的明确解释/示例,以及何时使用它们?
是否有区别:
我只是想快点检查一下.假设我在数据模型中有两个实体:Catalog和Product.它们之间具有多对多关系,并且都是必需的(目录必须至少有一个产品,并且所有产品必须各自属于至少一个目录).因此,如果我要删除一个产品,它的删除当然应该是Nullify.
但是删除政策对于目录应该是什么?如果删除目录,则并非其所有产品都必须完全属于它.产品可能属于多个目录.所以我绝对不应该使用Cascade.但是,Nullify是否足够?如果我最终得到不属于目录的悬挂产品怎么办?Core Data内置了什么可以用多对多模式解决这个问题?我需要修改我的架构吗?
我正在做一个视图从模型中删除(使用Django的通用视图DeleteView)一个实例,但它从其他模型级联并删除实例:
url(r'^person/(?P<pk>\d+)/delete/$', login_required(DeleteView.as_view(model=Person, success_url='/person/', template_name='delete.html')), name='person_delete'),
Run Code Online (Sandbox Code Playgroud)
我想要做的是显示将被删除的相关项目列表,如管理界面所做的那样,如:
Are you sure you are going to delete Person NAMEOFTHEPERSON?
By deleting it, you are also going to delete:
CLASSNAME1: CLASSOBJECT1 ; CLASSNAME2: CLASSOBJECT2 ; CLASSNAME3: CLASSOBJECT3 ; etc
Run Code Online (Sandbox Code Playgroud) 在Parent类中有一个列表List.保存父级时,已添加或更改的子级应由休眠保存/更新.
我已经找到了很多这方面的解释,但是,我只是没有得到它的工作.
Parent.class尝试A.
@Entity
public class Parent {
// id and other attributes
@OneToMany(mappedBy = "parent")
@org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.ALL)
protected List<child> children;
Run Code Online (Sandbox Code Playgroud)
Parent.class尝试B
@Entity
public class Parent {
// id and other attributes
@OneToMany(mappedBy = "parent", cascade = { javax.persistence.CascadeType.ALL },
orphanRemoval = true)
@org.hibernate.annotations.Cascade({
org.hibernate.annotations.CascadeType.PERSIST,
org.hibernate.annotations.CascadeType.MERGE,
org.hibernate.annotations.CascadeType.REFRESH,
org.hibernate.annotations.CascadeType.SAVE_UPDATE,
org.hibernate.annotations.CascadeType.REPLICATE,
org.hibernate.annotations.CascadeType.LOCK,
org.hibernate.annotations.CascadeType.DETACH })
protected List<child> children;
Run Code Online (Sandbox Code Playgroud)
将子项添加到新父项.之后两者都被保存了
sessionFactory.getCurrentSession().saveOrUpdate(parent);
Run Code Online (Sandbox Code Playgroud)
但是,当刷新时,我收到以下错误:
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: de.pockettaxi.backend.model.ride.RideSingle
at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:243)
at org.hibernate.type.EntityType.getIdentifier(EntityType.java:456)
at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:265)
at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:275) …Run Code Online (Sandbox Code Playgroud) 我有一个父表,它有一个引用它的dosen子表.这些子表又具有引用它们的其他子表.等等.
我需要从主父表中删除一行,将其一直向下级联.
在整个地方删除/重新创建约束以使它们"ON CASCADE DELETE"不是一个选项
仔细检查所有这些并手动删除子行是一场噩梦.
还有其他选择吗?
我的models.py文件包含:
class User(models.Model):
email = models.CharField(max_length=100, unique=True)
password = models.CharField(max_length=100)
create_time = models.DateTimeField(auto_now_add=True)
class Session(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
token = models.CharField(max_length=100, unique=True)
Run Code Online (Sandbox Code Playgroud)
当我命令python manage.py makemigrations然后命令python manage.py sqlmigrate <app_name> <migration_name>我没有看到任何说"ON DELETE = CASCADE"
但是,当我键入时,迁移工作没有失败python manage.py migrate.
现在,如果我转到mysql表(使用SequelPro)并尝试为当前有会话条目的用户删除一行,我会收到以下错误:" 未删除一行.重新加载表格以确保在此期间内容没有改变.检查控制台是否有可能在此表的主键内发生错误! ".
现在,当我转到会话表并删除该用户的会话,然后尝试从用户表中删除用户的行时,它会正确删除.这表明ON DELETE = CASCADE实际上并没有在MySQL级别工作.
我怎么能纠正它?
模特a:
has_many :b, :dependent => :delete_all
Run Code Online (Sandbox Code Playgroud)
模型b:
belongs_to :a
belongs_to :c
Run Code Online (Sandbox Code Playgroud)
模型c:
has_many :b
Run Code Online (Sandbox Code Playgroud)
当我删除一个时a,我也希望b's删除子项,以便从c's可能引用它们的任何内容中删除它们.但是,上述方法无效.我很感激任何帮助.
cascade ×10
django ×2
hibernate ×2
mysql ×2
sql ×2
.net ×1
activerecord ×1
annotations ×1
associations ×1
core-data ×1
foreign-keys ×1
many-to-many ×1
nhibernate ×1
one-to-many ×1
oracle ×1
orm ×1
postgresql ×1
python ×1
view ×1