JPA 中的参照完整性约束冲突错误



我正在尝试解析Web请求并保存到数据库。我有 3 个模型,第一个节点是虚拟文档。这是 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]

这是虚拟文档豆

@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
}

这是虚拟请求豆;

@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
}

这是标题列表豆;

@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;
}

我认为这就是你想要的:

@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;
}

更新了答案以将标头映射到请求实体。

相关内容

最新更新