Hibernate ALTER TABLE to add ON DELETE CASCADE语句
我想在PostgreSQL中执行以下操作(使用Hibernate): 显然,我上面的代码不起作用,所以我正在寻找正确的语句 如果我不能做到这一点,那么以下几点如何: 我的表中有一堆数据Hibernate ALTER TABLE to add ON DELETE CASCADE语句,hibernate,postgresql,cascade,cascading-deletes,postgresql-9.0,Hibernate,Postgresql,Cascade,Cascading Deletes,Postgresql 9.0,我想在PostgreSQL中执行以下操作(使用Hibernate): 显然,我上面的代码不起作用,所以我正在寻找正确的语句 如果我不能做到这一点,那么以下几点如何: 我的表中有一堆数据水果。表grapes将fruits中的id字段用作外键。我需要删除水果中的一个特定行,我希望删除操作级联到葡萄,并删除葡萄中具有指定id的所有条目。我该怎么做 delete from fruits where id = 1 cascade; 注意:我不想加入并删除grape中的相应数据。这只是一个例子。在实际应
水果
。表grapes
将fruits
中的id
字段用作外键。我需要删除水果
中的一个特定行,我希望删除操作级联到葡萄
,并删除葡萄
中具有指定id的所有条目。我该怎么做
delete from fruits where id = 1 cascade;
注意:我不想加入并删除grape
中的相应数据。这只是一个例子。在实际应用中,大量表依赖于结果
由于我使用的是Hibernate,因此对于使用delete语句的情况,Hibernate是否可以帮助执行此操作?
或者我可以用PostgreSQL中的信息架构或系统目录来实现这一点吗?这是一种单向父子关系,您希望父级的更改级联到子级,但不是相反。使用注释,我们可以实现这一点。在实体中:
@Cascade(value = { org.hibernate.annotations.CascadeType.ALL,
org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
@OneToMany(fetch = FetchType.LAZY, mappedBy = "fruit")
public Set<Grape> getGrapes() {
return grapes;
}
更新或删除父对象时,更改将自动级联到子对象。这是一种单向父子关系,您希望父对象的更改级联到子对象,而不是相反。使用注释,我们可以实现这一点。在实体中:
@Cascade(value = { org.hibernate.annotations.CascadeType.ALL,
org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
@OneToMany(fetch = FetchType.LAZY, mappedBy = "fruit")
public Set<Grape> getGrapes() {
return grapes;
}
当您更新或删除父级水果
时,更改将自动层叠到葡萄
子级。您描述的是使用ON delete cascade
选项的教科书
在SQL中,您可以在场景中创建表grapes
时隐式创建它:
CREATE TABLE grapes (
grape_id int PRIMARY KEY
fruit_id int REFERENCES fruits(fruit_id) ON DELETE CASCADE
);
你不会直接编辑系统目录,你几乎不会这样做!这就是上面这些陈述的目的
请注意,外键约束要求引用列上有一个唯一或主索引(fruits.fruit\id
,在您的情况下)并强制执行。您描述的是使用on DELETE CASCADE
选项的教科书
在SQL中,您可以在场景中创建表grapes
时隐式创建它:
CREATE TABLE grapes (
grape_id int PRIMARY KEY
fruit_id int REFERENCES fruits(fruit_id) ON DELETE CASCADE
);
你不会直接编辑系统目录,你几乎不会这样做!这就是上面这些陈述的目的
请注意,外键约束要求引用列上有唯一或主索引(fruits.fruit\u id
,在您的情况下)并强制执行。我找到了答案:
//in Fruit object
@OneToMany(mappedBy = "fruit", orphanRemoval=true)
private List<Grape> grapes;
//in Grape object
@OneToOne
private Fruit fruit;
//在水果对象中
@OneToMany(mappedBy=“fruit”,orphan=true)
私人名单葡萄;
//葡萄中的物体
@奥内托内
私家水果;
我找到了答案:
//in Fruit object
@OneToMany(mappedBy = "fruit", orphanRemoval=true)
private List<Grape> grapes;
//in Grape object
@OneToOne
private Fruit fruit;
//在水果对象中
@OneToMany(mappedBy=“fruit”,orphan=true)
私人名单葡萄;
//葡萄中的物体
@奥内托内
私家水果;
动机
这对我不起作用,我设置了
<property name="show_sql">true</property>
解决方案
因此,您的author类可能如下所示:
@Entity
@Table(name = "author")
public class Author {
@Id
@GeneratedValue(generator = "increment")
@GenericGenerator(name = "increment", strategy = "increment")
@Column(name = "ID")
private Integer id;
@Column(name = "NAME")
private String name;
@OneToMany(mappedBy = "author")
private Set<Book> books;
...
@Entity
@Table(name = "book")
public class Book {
@Id
@GeneratedValue(generator = "increment")
@GenericGenerator(name = "increment", strategy = "increment")
@Column(name = "ID")
private Integer id;
@Column(name = "TITLE")
private String title;
@ManyToOne
@JoinColumn(name = "AUTHOR_ID", foreignKey = @ForeignKey(name = "FK_BOOK_author_AUTHOR_ID"))
private Author author;
...
诀窍是使用
foreignKey = @ForeignKey(name = "FK_BOOK_author_AUTHOR_ID")
然后加上
<property name="hibernate.hbm2ddl.import_files">update.sql</property>
因此,hibernate始终能够删除/更改约束,因为它知道约束的名称-您还应该检查@Cascade设置-并且您必须实施一种策略来处理会话中对象的删除 动机
这对我不起作用,我设置了
<property name="show_sql">true</property>
解决方案
因此,您的author类可能如下所示:
@Entity
@Table(name = "author")
public class Author {
@Id
@GeneratedValue(generator = "increment")
@GenericGenerator(name = "increment", strategy = "increment")
@Column(name = "ID")
private Integer id;
@Column(name = "NAME")
private String name;
@OneToMany(mappedBy = "author")
private Set<Book> books;
...
@Entity
@Table(name = "book")
public class Book {
@Id
@GeneratedValue(generator = "increment")
@GenericGenerator(name = "increment", strategy = "increment")
@Column(name = "ID")
private Integer id;
@Column(name = "TITLE")
private String title;
@ManyToOne
@JoinColumn(name = "AUTHOR_ID", foreignKey = @ForeignKey(name = "FK_BOOK_author_AUTHOR_ID"))
private Author author;
...
诀窍是使用
foreignKey = @ForeignKey(name = "FK_BOOK_author_AUTHOR_ID")
然后加上
<property name="hibernate.hbm2ddl.import_files">update.sql</property>
因此,hibernate始终能够删除/更改约束,因为它知道约束的名称-您还应该检查@Cascade设置-并且您必须实施一种策略来处理会话中对象的删除 在水果POJO中,我必须创建一个字段grapes
像私人设置grapes代码>没有注释?关于父母的孩子也一样?是的。上面是getter上的注释;你仍然需要这个领域。在回来之前,我试着自己做很多事情,只是想看看是否有一个版本的你的文章可能有效。但它没有起作用。首先,它抱怨无法确定列(grapes)的类型:java.util.Set,table:Fruit;然后,当我将@ManyToOne
添加到Set grapes
字段时,它会显示缺少桌上水果\u grapes。仍然感谢您的发布。发布您的实体代码。您似乎遗漏了一些内容。在水果POJO中,我是否必须创建一个字段grapes
如私人设置grapes代码>没有注释?关于父母的孩子也一样?是的。上面是getter上的注释;你仍然需要这个领域。在回来之前,我试着自己做很多事情,只是想看看是否有一个版本的你的文章可能有效。但它没有起作用。首先,它抱怨无法确定列(grapes)的类型:java.util.Set,table:Fruit;然后,当我将@ManyToOne
添加到Set grapes
字段时,它会显示缺少桌上水果\u grapes。仍然感谢您的发布。发布您的实体代码。看来你错过了一些东西。