使用springboot + jpa保存到子表

时间:2016-05-09 16:01:50

标签: java jpa spring-boot

我在保存方面有困难...从子表中获取正在运行 这是我的父表pojo

@Entity
@Table(name = "Dei_Resources")
public class DeiResources {

    private int id;
    private String employeeId;
    private Set<DeiResourceType> deiResourceType;
    //other setters getters not included
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public int getId() {
        return id;
    }

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "deiResource", cascade = CascadeType.ALL)
    public Set<DeiResourceType> getDeiResourceType() {
        return deiResourceType;
    }

Child Table pojo

@Entity
public class DeiResourceType implements Serializable{

    private int id;
    private int resourceId;
    private String typeValue;
    @JsonBackReference
    private DeiResources deiResource;

    //other setters getters not included
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public int getId() {
        return id;
    }

    @ManyToOne(fetch=FetchType.LAZY,optional=false)
    @JoinColumn(name = "resourceId", referencedColumnName="id",insertable = false, updatable = false)
    public DeiResources getDeiResource() {
        return deiResource;
    }

我有DeiResourcesRepository,在我的服务中我正在尝试这个

DeiResources dei = new DeiResources();
DeiResourceType deii =  new DeiResourceType();
Set<DeiResourceType> deiResourceType = new HashSet<DeiResourceType>();
deii.setTypeValue("Driver");
deiResourceType.add(deii);
dei.setEmployeeId("unique1");
dei.setDeiResourceType(deiResourceType);
deiResourcesRepository.save(dei);

获取此错误

  

[错误] org.hibernate.engine.jdbc.spi.SqlExceptionHelper - ORA-02291:   违反完整性约束(DEI_ADMIN.DEI_RESOURCE_TYPE_R01) -   未找到父键

在DeiResourceType表中,我添加了具有父表ID的外键约束。如何摆脱这个错误,任何建议/帮助?

1 个答案:

答案 0 :(得分:0)

首先,在SQL中没有Child / Parent模式。这就是为什么像真正的家庭这样的结构的想象力是错误的。在这个例子中,父母不能是孩子,在现实世界中,作为父母的每个人都是孩子!

我们只有两个关于约束的1-n关系表,每个DeiResource必须有一个DeiResourceType!只要这种约束使其保持完整性,就没有例外。

请注意您调用两个实体的构造函数只保存一个(在没有DeiResourceType的情况下保存DeiResource)。所以你保存一个没有类型的资源。但是每个 DeiResource必须具有DeiResourceType 的约束被破坏,数据库不再具有完整性并抛出异常!

您有两种选择:

  • 首先保存DeiResourceType,然后保存DeiResource
  • 首先加载现有的DeiResourceType,然后将其连接到DeiResource并保存DeiResource。

我更希望第二种方法避免表“DeiResourceType”中的重复。

(顺便说一下,theese约束可以推迟,一个古老的,被遗忘的和强大的魔法)