JPA中的参照完整性约束违规错误

时间:2017-07-20 08:28:00

标签: java hibernate spring-mvc jpa spring-boot

我正在尝试解析Web请求并保存到数据库。我有3个模型,第一个节点是virtualDocument。这是uniq表(根据请求url)。 VirtualRequest表具有所有erquest主体,HttpHeaderList表根据其virtualRequest bean id包含所有thhp头。

当我试图保存我得到的第一个日志时,这样的错误;

org.h2.jdbc.JdbcSQLException: Referential integrity constraint violation: "FK1TW2G47F7A47580KQVMDJWGBQ: PUBLIC.T_VIRTUAL_REQUEST FOREIGN KEY(REQUEST_ID) REFERENCES PUBLIC.T_VIRTUAL_DOCUMENT(DOCUMENT_ID) (65)"; SQL statement:
insert into t_virtual_request (request_id, media_type, method_type, request_url) values (null, ?, ?, ?) [23506-192]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:345) ~[h2-1.4.192.jar:1.4.192]

这里是VirtualDocument bean

@Entity
@Table(name = "t_virtual_document")
public class VirtualDocument {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "document_id")
    private long documentId;

    @Column(name = "real_url", unique = true)
    private String realURL; //uniq

    @Column(name = "virtual_url", unique = true)
    private String virtualURL; //uniq

    @Column(name = "simulation_mode", columnDefinition = "varchar(10) default 'STOP'")
    private String simulationMode;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "request_id")
    private List<VirtualRequest> requestList;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "response_id")
    private List<VirtualResponse> responseList;

   //getter setter without any annotation
}

这是VirtualRequest bean;

@Entity
@Table(name = "t_virtual_request")
public class VirtualRequest {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "request_id")
    private long requestId;

    @Column(name = "request_url")
    private String requestURL;

    @Column(name = "method_type")
    private String methodType;

    @Column(name = "media_type")
    private String mediaType;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "header_id")
    private List<HttpHeaderList> requestHeaders;

   //getter setter without any annotation
}

这里是HeaderList bean;

@Entity
@Table(name = "t_http_headers")
public class HttpHeaderList {

    @Id
    @Column(name = "header_id")
    private long headerId;

    @Column(name = "header_key")
    private String headerKey;

    @Column(name = "header_value")
    private String headerValue;
}

1 个答案:

答案 0 :(得分:1)

我认为这就是你想要的:

@Entity
@Table(name = "t_virtual_document")
public class VirtualDocument {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "document_id")
    private long documentId;

    @Column(name = "real_url", unique = true)
    private String realURL; //uniq

    @Column(name = "virtual_url", unique = true)
    private String virtualURL; //uniq

    @Column(name = "simulation_mode", columnDefinition = "varchar(10) default 'STOP'")
    private String simulationMode;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "virtualDocument")
    private List<VirtualRequest> requestList;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "virtualDocument")
    // Note the mappedBy parameter. This points to the property in the entity that owns the relationship (in this case the VirtualResponse).
    private List<VirtualResponse> responseList;

   //getter setter without any annotation
}

@Entity
@Table(name = "t_virtual_request")
public class VirtualRequest {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "request_id")
    private long requestId;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "document_id")
    private VirtualDocument virtualDocument;

    @Column(name = "request_url")
    private String requestURL;

    @Column(name = "method_type")
    private String methodType;

    @Column(name = "media_type")
    private String mediaType;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "virtualRequest")
    private List<HttpHeaderList> requestHeaders;

   //getter setter without any annotation
}

@Entity
@Table(name = "t_http_headers")
public class HttpHeader { /*Note this is a more appropriate name for the entity since it holds the data of a single header.*/

    @Id
    @Column(name = "header_id")
    private long headerId;

    @Column(name = "header_key")
    private String headerKey;

    @Column(name = "header_value")
    private String headerValue;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "request_id")
    private VirtualRequest virtualRequest

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "response_id")
    private VirtualResponse virtualResponse;
}

更新了将标题添加到请求实体的答案。