java - 删除一对一关系

标签 java hibernate one-to-one

我有这些类(class)。

@Entity
@Table(name ="a")
class A{
  private Integer aId;
  private B b;

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "id_a")
  public Integer getAId() {
return aId;
  }

  @OneToOne(mappedBy = "a", cascade={CascadeType.ALL})
  public B getB() {
        return b;
    }
}

@Entity
@Table (name= "b")
class B{
    private A a;

    @OneToOne
    @JoinColumn(name = "id_a")
    public A getA() {
        return a;
    }

}

表格看起来像:

A) | id_A |....other fields...|

B) | id_B | fk_id_A |..other fields..|

但是,当我尝试删除 A 的一个实例时,我得到了,

org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade : (remove deleted object from associations)[B#130]

我试过在交叉引用上设置 null:

b.setA(null) 
a.setB(null)

但仍然会抛出异常。

我所做的只是删除 A 中的一行,并将 B 的外键保留为空,但是当我尝试删除 B 时,出现相同的错误。

这是我的删除代码:

public static void delete(Object object) throws Exception {
        Transaction tx = getSession().beginTransaction();       
        try {
            getSession().delete(object);
            tx.commit();
        } catch (Exception ex) {
            tx.rollback();
            getSession().close();
            throw ex;
        }
    }

getSession 总是返回一个有效的 session 。

有什么我遗漏的吗?

最佳答案

从上到下继续工作。您需要删除表 B 中对 A 的引用。因此,在 B 中找到您要在 A 中删除的记录的引用,并在 B 中删除该记录。然后返回 A 并删除 A 中的记录。

如果您使用的是 SQL Server,您可以在表 A 上设置级联删除,这将自动为您完成。不过,您必须小心。对于复杂的结构,我不建议这样做。

关于java - 删除一对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1080771/

相关文章:

javascript - 如何使用Java + Selenium WebDriver移动到动态页面底部

java - 建立连接时的 HttpsURLConnection 状态码 302

hibernate - 使用 tls/ssl 通过 hibernate 连接到 postgres

java - 带注释的 Collection 袋

Spring 分层上下文

grails - Grails 中的 Fixtures 插件引用完整性异常

java - com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException : Column cannot be null/one-to-one mapping

java - toString()、==、equals() 对象方法在引用和原始类型上的工作方式有何不同或相似?

java - 是否可以使用异常来检查数组边界?

java - 未添加 JPA 一对一关系