Hibernate ALTER TABLE to add ON DELETE CASCADE语句

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中的相应数据。这只是一个例子。在实际应

我想在PostgreSQL中执行以下操作(使用Hibernate):

显然,我上面的代码不起作用,所以我正在寻找正确的语句

如果我不能做到这一点,那么以下几点如何:

我的表中有一堆数据
水果
。表
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。仍然感谢您的发布。发布您的实体代码。看来你错过了一些东西。