【问题标题】:Hibernate Foreign Key Error休眠外键错误
【发布时间】:2016-06-08 13:44:46
【问题描述】:

所以在我的 Oracle 数据库中,我有两个表,它们都正确定义了外键约束。

这是两个表的 DDL。

CREATE TABLE "BI***********"."PROJECT" 
   (    
        "PROJECT_ID" NUMBER(10,0) NOT NULL, 
        "PROJECT_CODE" VARCHAR2(20) NOT NULL, 
        "PRODUCT_ID" NUMBER(10,0) NOT NULL, 
        "DESCRIPTION" VARCHAR2(45) NOT NULL,
        CONSTRAINT PROJECT_PK PRIMARY KEY ("PROJECT_ID"),
        CONSTRAINT "PROJECT_FK1" FOREIGN KEY ("PRODUCT_ID")
            REFERENCES "BI***********"."PRODUCT" ("PRODUCT_ID")
   );
CREATE TABLE "BI***********"."PRODUCT" 
   (    
        "PRODUCT_ID" NUMBER(10,0) NOT NULL, 
        "PRODUCT_NAME" VARCHAR2(20) NOT NULL, 
        "DESCRIPTION" VARCHAR2(45) NOT NULL,
        CONSTRAINT PRODUCT_PK PRIMARY KEY ("PRODUCT_ID")
   );

下面是对应的带有 Hibernate Annotations 的 Java 代码:

@Entity
@Table (name="project")
@SequenceGenerator(name="seq_project",sequenceName="BI***********.SEQ_PROJECT", allocationSize=1, initialValue=1)
public class Project {

    //Fields
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq_project")
    @Column(name="PROJECT_ID")
    private int id;
    @Column(name="PROJECT_CODE")
    private String projectCode;
    @Column(name="PRODUCT_ID")
    private int productId;
    @Column(name="DESCRIPTION")
    private String description;

@Entity
@Table (name="product")
@SequenceGenerator(name="seq_product",sequenceName="BI***********.SEQ_PRODUCT", allocationSize=1, initialValue=1)
public class Product {

    //Fields
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq_product")
    @Column(name="PRODUCT_ID")
    private int id;
    @Column(name="PRODUCT_NAME")
    private String productName;
    @Column(name="DESCRIPTION")
    private String description;

但是,当我尝试使用 hibernate 添加到表时,我收到以下错误代码:

Hibernate: insert into project (DESCRIPTION, PRODUCT_ID, PROJECT_CODE, PROJECT_ID) values (?, ?, ?, ?)
Jun 08, 2016 9:06:49 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 2291, SQLState: 23000
Jun 08, 2016 9:06:49 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: ORA-02291: integrity constraint (BIMB2013WMMEE.PROJECT_FK1) violated - parent key not found

Jun 08, 2016 9:06:49 AM org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl release
INFO: HHH000010: On release of batch it still contained JDBC statements
Jun 08, 2016 9:06:49 AM org.hibernate.internal.SessionImpl$5 mapManagedFlushFailure
ERROR: HHH000346: Error during managed flush [could not execute statement]
Jun 08, 2016 9:06:49 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH10001008: Cleaning up connection pool [jdbc:oracle:thin:@endeavour.us.manh.com:1523/pso11r2f]
Exception in thread "main" org.hibernate.exception.ConstraintViolationException: could not execute statement
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:59)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:97)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:207)
    at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:45)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2921)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3421)
    at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:89)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:560)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:434)
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:337)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1295)
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:468)
    at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3135)
    at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2352)
    at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:485)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:147)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$100(JdbcResourceLocalTransactionCoordinatorImpl.java:38)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:231)
    at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:65)
    at com.luv2code.demo.CreateClientDemo.main(CreateClientDemo.java:37)
Caused by: java.sql.SQLIntegrityConstraintViolationException: ORA-02291: integrity constraint (BIMB2013WMMEE.PROJECT_FK1) violated - parent key not found

    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:447)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:951)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:513)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:227)
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)

【问题讨论】:

    标签: java sql oracle hibernate foreign-keys


    【解决方案1】:

    看看你的错误

    Caused by: java.sql.SQLIntegrityConstraintViolationException: ORA-02291: integrity constraint (BIMB2013WMMEE.PROJECT_FK1) violated - parent key not found
    

    您在“项目”中的外键引用了“产品”中不存在的主键。您必须在表格之间建立链接

    你必须改变你的注释来做类似的事情

    @Entity
    @Table (name="project")
    @SequenceGenerator(name="seq_project",sequenceName="BI***********.SEQ_PROJECT", allocationSize=1, initialValue=1)
    public class Project {
    
    //Fields
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE,  generator="seq_project")
    @Column(name="PROJECT_ID")
    private int id;
    @Column(name="PROJECT_CODE")
    private String projectCode;
    @OneToOne(fetch=FetchType.EAGER, cascade=CascadeType.ALL)
    @JoinColumn(name="PRODUCT_ID",insertable=true,
    updatable=true,nullable=false,unique=true)
    private Product product;
    @Column(name="DESCRIPTION")
    private String description;
    
    @Entity
    @Table (name="product")
    @SequenceGenerator(name="seq_product",sequenceName="BI***********.SEQ_PRODUCT", allocationSize=1, initialValue=1)
    public class Product {
    
    //Fields
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq_product")
    @Column(name="PRODUCT_ID")
    private int id;
    @Column(name="PRODUCT_NAME")
    private String productName;
    @Column(name="DESCRIPTION")
    private String description
    @OneToOne (mappedBy="PRODUCT_ID",fetch=FetchType.EAGER)
    private Project project;
    

    或者你可以使用@PrimaryKeyJoinColumn注解

    @PrimaryKeyJoinColumn
    private Project project;
    

    你会发现更多关于关系的信息here

    【讨论】:

    • 二文 感谢您的回复。我实现了你给我的注释并遇到了这个错误:线程“主”org.hibernate.AnnotationException中的异常:@OneToOne属性上不允许@Column:com.manh.entries.Project.product
    【解决方案2】:

    我的猜测是您需要将 Product 类提供给您的 Project 类,而不是您现在使用的 productId Integer。

    CONSTRAINT "PROJECT_FK1" FOREIGN KEY ("PRODUCT_ID")
    REFERENCES "BI***********"."PRODUCT" ("PRODUCT_ID")
    

    外键表明两个表之间存在引用,而在您的代码中您只传递一个整数,而不是完整的 Product 类作为对象

    因此我认为您需要更换:

    @Column(name="PRODUCT_ID")
    private int productId;
    

    在您的项目类中使用以下内容:

    @Column(name="PRODUCT_ID")
    @OneToOne
    private Product product;
    

    【讨论】:

    • 嘿伊戈兰兹。感谢您的回复。我继续尝试了这个,但仍然在线程“main”org.hibernate.AnnotationException 中收到异常:@ OneToOne 或 com.manh.entries.Project.product 上的 @ManyToOne 引用了一个未知实体:com.manh.entries.Product .检查此线程:stackoverflow.com/questions/37711136/…
    【解决方案3】:

    您在 cfg.xml 文件中有错误。在

    中将hbm2dll改为hbm2ddl

    "hibernate.hbm2dll.auto">创建

    然后生活将再次美丽。我知道这一点是因为我犯了同样的错误并花了几个小时才弄明白。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      • 2021-06-15
      • 2018-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多