我正在使用JPA 2.0和hibernate.我有一个User类和一个Group类,如下所示:
public class User implements Serializable {
@Id
@Column(name="USER_ID")
private String userId;
@ManyToMany
@JoinTable(name = "USER_GROUP",
joinColumns = {
@JoinColumn(name = "GROUP_ID")
},
inverseJoinColumns = {
@JoinColumn(name = "USER_ID")
}
)
private Set<Group> groupList;
//get set methods
}
public class Group
{
@Id
@Column(name="GROUP_ID")
private String groupId;
@ManyToMany(mappedBy="groupList")
private Set<User> memberList;
//get set methods
}
Run Code Online (Sandbox Code Playgroud)
然后,我创建一个用户和组,然后将用户分配给该组.
我想要的是当我删除该组时,该组将被删除(当然),该组所拥有的所有用户组关系将自动从USER_GROUP连接表中删除,但用户本身不会从USER表.
使用上面的代码,当我删除一个组时,只删除GROUP表中的行,并且用户仍然会在USER_GROUP连接表中有一个已删除组的条目.
如果我将Cascade放在User类中,如下所示:
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name = "USER_GROUP",
joinColumns =
{
@JoinColumn(name = "GROUP_ID")
},
inverseJoinColumns =
{
@JoinColumn(name = "USER_ID")
})
private Set<Group> …Run Code Online (Sandbox Code Playgroud) 如何在休眠中使用级联和反向?定义它们的过程/标记是什么?它们是否相互关联,它们如何有用?
我很难理解Doctrine手册对级联操作的解释,需要有人帮助我理解简单的ManyToOne关系中的选项.
在我的应用程序中,我有一个名为Article的表/实体,它有一个外键字段,引用名为Topic的表/实体中的'id'字段.
当我创建新文章时,我从下拉菜单中选择主题.这会在Article表的'topic_id'外键字段中插入一个整数.
我在Article实体中设置了$ topic关联,如下所示:
/**
* @ManyToOne(targetEntity="Topic")
* @JoinColumn(name="topic_id", referencedColumnName="id", nullable=false)
*/
private $topic;
Run Code Online (Sandbox Code Playgroud)
主题实体没有关于Article实体的任何往复注释.当删除引用主题的文章时,主题不关心什么文章引用它们,并且不需要在主题中发生任何事情.
因为我没有在Article实体中指定级联操作,所以当我尝试创建新文章时,Doctrine会抛出错误:"通过未配置为级联持久操作的关系找到新实体.明确地保留新实体或者在关系上配置级联持久化操作."
所以我知道我需要选择一个级联操作来包含在Article实体中,但是我怎么知道在这种情况下选择哪个操作呢?
从阅读Doctrine手册开始,"分离"听起来就像是正确的选择.但是在这里和这里研究其他人的类似问题让我觉得我想用"坚持"代替.
任何人都可以帮助我理解"持久","删除","合并"和"分离"是否意味着简单的ManyToOne关系,就像我所描述的那样?
我有一个组件数据库.每个组件都是特定类型.这意味着组件和类型之间存在多对一关系.当我删除一个类型时,我想删除所有具有该类型外键的组件.但是如果我没弄错的话,级联删除会在删除组件时删除该类型.有没有办法做我描述的?
我总是害怕使用DELETE CASCADE,但随着我越来越自信(懒惰:D),我在想它有多糟糕,最好的做法是使用它还是我应该避免它并清理我的外键等老式方式(带存储过程)?
我有一个充满客户数据的数据库.这是如此之大,以至于操作起来非常麻烦,我宁愿将其减少到10%的客户,这对于开发来说是充足的.我有很多表,我不想用"ON DELETE CASCADE"改变它们,特别是因为这是一次性的交易.
我可以执行删除操作,在没有先设置它们的情况下级联所有表吗?如果没有,我最好的选择是什么?
我有两张桌子在这里:
DROP TABLE IF EXISTS schemas.book;
DROP TABLE IF EXISTS schemas.category;
DROP SCHEMA IF EXISTS schemas;
CREATE SCHEMA schemas;
CREATE TABLE schemas.category (
id BIGSERIAL PRIMARY KEY,
name VARCHAR NOT NULL,
UNIQUE(name)
);
CREATE TABLE schemas.book (
id BIGSERIAL PRIMARY KEY,
published DATE NOT NULL,
category_id BIGINT NOT NULL REFERENCES schemas.category ON DELETE CASCADE ON UPDATE CASCADE,
author VARCHAR NOT NULL,
name VARCHAR NOT NULL,
UNIQUE(published, author, name),
FOREIGN KEY(category_id) REFERENCES schemas.category (id)
);
Run Code Online (Sandbox Code Playgroud)
所以逻辑很简单,用户删除了类别x下的所有书籍后,x从猫中删除,我尝试了上面的方法但是不起作用,在我清理了表格书之后,表格类别仍然填充,有什么问题?
是否有任何互联网资源对NHibernate的所有级联设置有明确的指导,其中包括类结构,HBM的示例以及与NH的所有关系的每个级联设置的动作的含义.
如果有以最正确的方式进行公共关联的示例,例如设置状态表,您将永远不会最终级联删除状态,或者删除具有CreatedBy用户属性的对象,那么它将会很有用.永远不会在级联等中删除用户
在oracle中,要删除所有表和约束,您可以键入类似的内容
DROP TABLE myTable CASCADE CONSTRAINTS PURGE;
Run Code Online (Sandbox Code Playgroud)
这将完全删除表及其依赖项.什么是SQL服务器等价?
我在MySQL中有表"A".它有一些参考,级联删除到一些其他表("B","C","D"......).当某些内容从"A"中删除时,我需要使用触发器.当我直接从"A"删除记录时,此触发器有效.但它不适用于级联删除.是否存在任何版本的MySQL,我的触发器将与级联删除一起使用?或者,也许还有另一种方式来打电话
cascade ×10
sql ×4
sql-server ×3
hibernate ×2
mysql ×2
c# ×1
doctrine-orm ×1
foreign-keys ×1
inverse ×1
java ×1
jpa ×1
jpa-2.0 ×1
many-to-many ×1
nhibernate ×1
postgresql ×1
sql-drop ×1
triggers ×1