AHijaouy
AHijaouy

Reputation: 124

Hibernate Foreign Key Error

So in my Oracle database I have two tables which have a foreign key constraint properly defined.

Here are the DDL for the two tables.

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")
   );

And here is the corresponding Java code with the Hibernate Annotations:

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

However, when I try to add to the tables with hibernate I'm receiving the following error code:

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)

Upvotes: 0

Views: 4310

Answers (3)

Eya Hidri
Eya Hidri

Reputation: 1

You have an error in the cfg.xml file. Change hbm2dll to hbm2ddl in

"hibernate.hbm2dll.auto">create

Then life will be beautiful again. I know this because I made the same mistake and spent some hours to figure it out.

Upvotes: 0

Erwan C.
Erwan C.

Reputation: 719

Look at your error

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

Your foreign key in "project" references a primary key in "product" that doesn't exists. You have to make the link between your tables

You have to change your annotations for something like that

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

or you can use @PrimaryKeyJoinColumn annotation with

@PrimaryKeyJoinColumn
private Project project;

You'll find more informations about relationships here

Upvotes: 1

Igoranze
Igoranze

Reputation: 1486

My guess is that you need to give the Product class to your Project class, instead of the productId Integer you are using right now.

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

The foreign key states that there is a reference between the two tables, while in your code you only pass an integer, and not the full Product class as an object

Thus i would think that you need to replace:

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

in your Project class with the following:

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

Upvotes: 0

Related Questions