当前位置: 首页 > 面试题库 >

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

毋宪
2023-03-14
问题内容

我正在尝试解析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;
}

问题答案:

我认为这是您想要的:

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

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



 类似资料:
  • 照明\database\queryexception SQLSTATE[23000]:完整性约束违反:19 NOT NULL约束失败:users.password(SQL:插入“users”(“name”、“email”、“username”、“updated_at”、“created_at”)值(MADHUP KUMAR,Chandrashivam99@gmail.com,Vansh123,20

  • 问题内容: 我正在尝试使用ALTER IGNORE TABLE + UNIQUE KEY从MySQL表中删除重复项。MySQL文档说: IGNORE是标准SQL的MySQL扩展。如果新表中的唯一键上有重复项,或者在启用严格模式时出现警告,则它控制ALTER TABLE的工作方式。如果未指定IGNORE,则在发生重复键错误时,副本将中止并回滚。如果指定了IGNORE,则只有第一行用于唯一键重复的行。

  • 我正在使用Hibernate 4.0最终版和ojdbc6来开发我的网络应用程序。一切都好,除了当我试图插入一个新的父母/孩子的关系。首先,这些是实体: 让我们看看这两个场景: 员工已存在,我尝试向其添加新地址-- 这是事务处理程序: 你可以想象,2.b的案子是我关心的。我已经调试了事务,这是我调用保存()方法(在DAO类中)时得到的: 会议结束了。saveOrUpdate(employee)方法成

  • 问题内容: 嗨,我正在Oracle SQL开发人员中开发数据库,​​试图从另一个表访问foriegn键。我目前正在使用以下CREATE语句创建的ItemOrdered表 如您所见,我具有以下前键Ords和BeltID。 现在,当我尝试运行以下语句时 它给了我以下错误 违反-找不到父密钥02291。00000-“违反完整性约束(%s。%s)-找不到父密钥” 如果需要,我已经提供了Ords CREAT

  • 我使用一个自定义的API请求到我的数据库来生成一个新的条目。 我的表格结构是这样的: 表结构 我将Incident_Type设置为唯一,因为这是我的系统的要求。当我向系统发布新条目时: 第一次很好。 第二次: 当我使用不同的事件id时,我得到错误: 为什么发送请求使用完全相同的条目,即使我更改了数据?我该怎么解决这个问题?

  • 我试图为和创建会话,这两个表都与相同的外键关联到登录表-但是当我为创建种子时,我得到了错误,在我的另一个问题在这个链接中,我没有以最好的方式解释,但得到了一些关于使用(党-角色-关系模型)和这段代码下面他更多的想法有关已解决的问题链接 创建表和主键 创建表和主键 创建表以及主键和外键 使用表为管理员创建会话的过程: 使用表为用户创建会话的过程: 创建管理会话时,我收到一个错误 我做错了什么?