我想我误解了在@ManyToOne
关系背景下级联的意义.
案子:
public class User {
@OneToMany(fetch = FetchType.EAGER)
protected Set<Address> userAddresses;
}
public class Address {
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
protected User addressOwner;
}
Run Code Online (Sandbox Code Playgroud)
这是什么意思cascade = CascadeType.ALL
?例如,如果我从数据库中删除某个地址,我添加的事实如何cascade = CascadeType.ALL
影响我的数据(User
我猜)?
我对JPA 2.0 orphanRemoval
属性有点困惑.
当我使用JPA提供程序的数据库生成工具创建底层数据库DDL以获得ON DELETE CASCADE
特定关系时,我想我可以看到它是必需的.
但是,如果数据库存在并且它已经存在ON DELETE CASCADE
关系,那么这还不足以级联删除吗?什么是orphanRemoval
除了做?
干杯
在PostgreSQL 8中,是否可以ON DELETE CASCADES
在不丢弃后者的情况下添加到下表中的两个外键?
# \d scores
Table "public.scores"
Column | Type | Modifiers
---------+-----------------------+-----------
id | character varying(32) |
gid | integer |
money | integer | not null
quit | boolean |
last_ip | inet |
Foreign-key constraints:
"scores_gid_fkey" FOREIGN KEY (gid) REFERENCES games(gid)
"scores_id_fkey" FOREIGN KEY (id) REFERENCES users(id)
Run Code Online (Sandbox Code Playgroud)
两个引用的表都在下面 - 这里:
# \d games
Table "public.games"
Column | Type | Modifiers
----------+-----------------------------+----------------------------------------------------------
gid | integer | not null default nextval('games_gid_seq'::regclass)
rounds | integer | …
Run Code Online (Sandbox Code Playgroud) postgresql cascade constraints cascading-deletes postgresql-8.4
如果我在数据库中有两个关系,如下所示:
CREATE TABLE Courses (
CourseID int NOT NULL PRIMARY KEY,
Course VARCHAR(63) NOT NULL UNIQUE,
Code CHAR(4) NOT NULL UNIQUE
);
CREATE TABLE BookCourses (
EntryID int NOT NULL PRIMARY KEY,
BookID int NOT NULL,
Course CHAR(4) NOT NULL,
CourseNum CHAR(3) NOT NULL,
CourseSec CHAR(1) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
我建立了两者之间的外键关系,如下所示:
ALTER TABLE BookCourses
ADD FOREIGN KEY (Course)
REFERENCES Courses(Code)
ON DELETE CASCADE;
Run Code Online (Sandbox Code Playgroud)
然后,你可以看到,Course
在属性BookCourses
关系引用Code
属性的Courses
关系.
我的问题是当两个关系中的任何一个发生删除时,删除级联的方式是什么?如果我删除Courses
关系中的元组,它会删除关系中的所有引用元组BookCourses
,还是反过来?
感谢您的时间.
在SQL Server中设置外键时,在什么情况下应该在删除或更新时级联它,背后的原因是什么?
这可能也适用于其他数据库.
我最关注每个场景的具体例子,最好是那些成功使用它们的人.
我尝试收集有关以下方式的一些信息,以便在删除父实体时自动删除子实体.似乎最常见的方法是使用这三个注释:cascade = {"remove"} OR orphanRemoval = true OR ondelete ="CASCADE".
我对第三个问题感到有点困惑:ondelete ="CASCADE",正如关于这个的官方文档中的解释非常稀缺)如果有人能够证实我从我的研究中收集和了解的以下信息,我会很高兴.网和经验......
cascade = {"remove"}
==>当拥有方实体为时,删除反面的实体.即使你与其他拥有的实体有许多不同之处.
- 应该用于集合(所以在OneToMany或ManyToMany关系中)
- 在ORM中实现
orphanRemoval = true
==>当拥有方实体为AND时,将删除反方的实体,并且它不再连接到任何其他拥有方实体.(参考 doctrine official_doc
- ORM中的实现
- 可以与OneToOne,OnetoMany或ManyToMany一起使用
onDelete ="CASCADE"
==>这会将删除级联添加到数据库中的外键列
- 这个策略有点难以实现,但可以非常强大和快速.(参见 doctrine official_doc ......但还没有阅读更多解释)
- ORM必须做的工作少(与之前的两种做法相比),因此应该有更好的表现.
其他信息
- 所有这三种方式都在双向关系实体实现(右???)
- 使用cascade = {"remove"}完全绕过任何外键onDelete = CASCADE.(参见doctrine_official_doc)
级联= { "去除"}
/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", …
Run Code Online (Sandbox Code Playgroud) 我想检查一下我对Doctrine关联的级联操作的理解.出于这个问题的目的,我有两个模型:Customer
和Insuree
.
如果我定义了一个许多人之间一对多的关系Customer
,并Insuree
与集cascade{"all"}
,我明白,这将:
这是关联的定义Customers
.
/**
* @ORM\ManyToMany(targetEntity="Insuree", inversedBy="customers", cascade={"all"})
* @ORM\JoinTable(name="customer_insuree",
* joinColumns={@ORM\JoinColumn(name="customer_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="insuree_id", referencedColumnName="id")}
* )
*/
protected $insurees;
Run Code Online (Sandbox Code Playgroud)
如果我定义了逆许多人的之间有很多关系Insuree
,并Customer
与集cascade{"all"}
,我明白,这将:
这是关联的定义Insurees
.
/**
* @ORM\ManyToMany(targetEntity="Customer", mappedBy="insurees", cascade={"all"})
*/
protected $customers;
Run Code Online (Sandbox Code Playgroud)
如果我然后定义关于级联保持,合并和分离的关系 - 删除保险人将不会删除所有相关客户 - 它只会删除保险公司与其客户之间的关联?
/**
* @ORM\ManyToMany(targetEntity="Customer", mappedBy="insurees", cascade={"persist", "merge", "detach"})
*/
protected $customers;
Run Code Online (Sandbox Code Playgroud) 上面两个选项有什么区别?什么时候最好选择每个选项?
MySQL RESTRICT
和FK之间有什么区别NO ACTION
?从文档中他们看起来完全一样.是这样的吗?如果是这样,为什么两者都有?
我一直在OpenCV(开源计算机视觉库)中进行面部检测实验,发现可以使用Haar级联来检测面部,因为其中有几个提供了OpenCV.但是,我注意到还有几个LBP级联.根据OpenCV人脸检测文档,经过一些研究,我发现LBP代表局部二进制模式,也可以用于人脸检测.
我想知道的是哪个更好?哪一个表现得更快,哪一个更准确?似乎LBP表现得更快,但我也不是100%肯定.谢谢.
cascade ×10
doctrine ×3
foreign-keys ×2
jpa ×2
symfony ×2
constraints ×1
database ×1
entity ×1
haar-wavelet ×1
hibernate ×1
java ×1
jpa-2.0 ×1
many-to-one ×1
mysql ×1
one-to-many ×1
opencv ×1
php ×1
postgresql ×1
rdbms ×1
relation ×1
sql ×1
sql-server ×1
viola-jones ×1