一对一的级联持久性抛出“外键列不允许使用NULL” JdbcSQLIntegrityConstraintViolationException

时间:2019-12-10 01:53:51

标签: hibernate spring-data-jpa jpa-2.0

假设我有两个实体 A B

A拥有B,并且在创建A时,还必须创建B。 当删除A时,关联的B也应删除。 (因此,我将级联划分为A类而不是B类) 但是出于某些原因,我将外键 aId 放在了表 B 中。

它应该看起来像:

enter image description here

B拥有外键列,但我的域A应该是所有者。

这是我的暂定代码


@Entity
public class A{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @OneToOne(cascade = CascadeType.ALL)
    private B b;
    ...
}


@Entity
public class B{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @OneToOne(mappedBy = "b", fetch = FetchType.LAZY)
    @JoinColumn(name = "aId")
    private A a;
}

结果:

当我通过Spring JPA存储库保存A时,它会抛出类似情况

org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: 
NULL not allowed for column "AID"; SQL statement:
insert into B(id, aId, ...) values (null, ?, ...)

似乎没有先保存实例A及其ID,然后将B保存到创建的A ,结果打破了援助的非零约束。

如何正确解决此问题?谢谢。

2 个答案:

答案 0 :(得分:0)

您应通过以下方式更正映射:

@Entity
public class A{
    ...

    @OneToOne(mappedBy = "a", cascade = CascadeType.ALL)
    private B b;
    ...
}


@Entity
public class B{
    ...
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "aId")
    private A a;
}

答案 1 :(得分:0)

from distutils.core import setup
setup(
    name = 'nester',
    version = '1.0.0',
    py_modules = ['nester'],
    author = 'hfpython',
    author_email = 'hfpython@headfirstlabs.com',
    url = 'http://www.headfirstlabs.com',
    description = 'A simple printer of nested lists',
)