简体   繁体   English

在JPA中添加具有外键列值的行为null

[英]Add row with foreign key column value is null in jpa

How can I add a row to table if that row has column which is foreign key and its value is null. 如果该行具有作为外键的列并且其值为null,那么如何将其添加到表中。

How can I do this using JPA. 如何使用JPA做到这一点。

public class ExtractionConfig {
private RunHistory runHistoryByLastRunId;

    @OneToOne
    @JoinColumn(name = "last_run_id", referencedColumnName = "run_id", insertable = false, updatable = false)
    public RunHistory getRunHistoryByLastRunId() {
        return runHistoryByLastRunId;
    }
}

This is how I am saving it 这就是我的保存方式

ExtractionConfig extractionConfig = new ExtractionConfig();
extractionConfigRepository.save(extractionConfig);

Database table sql 数据库表sql

CREATE TABLE IF NOT EXISTS `camel`.`extraction_config` (
  `last_run_id` INT(11) NULL DEFAULT NULL,
  INDEX `fk_extraction_config_1_idx` (`last_run_id` ASC),
  CONSTRAINT `fk_extraction_config_1`
    FOREIGN KEY (`last_run_id`)
    REFERENCES `camel`.`run_history` (`run_id`)
    ON DELETE RESTRICT
    ON UPDATE CASCADE,

ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;

Exception I am getting 我得到的例外

Caused by: 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:109)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:95)
    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:2884)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3384)
    at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:89)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:451)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:336)
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:335)
    at org.hibernate.event.internal.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:50)
    at org.hibernate.internal.SessionImpl.autoFlushIfRequired(SessionImpl.java:1193)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1261)
    at org.hibernate.internal.QueryImpl.list(QueryImpl.java:87)
    at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:567)
    at org.hibernate.jpa.internal.QueryImpl.getSingleResult(QueryImpl.java:482)
    ... 56 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`camel`.`extraction_config`, CONSTRAINT `fk_extraction_config_1` FOREIGN KEY (`last_run_id`) REFERENCES `run_history` (`run_id`) ON UPDATE CASCADE)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
    at com.mysql.jdbc.Util.getInstance(Util.java:381)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2019)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1937)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1922)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:204)
    ... 69 more

I want to save ExtractionConfig object to database with no/null RunHistory reference. 我想使用无/空RunHistory引用将ExtractionConfig对象保存到数据库。 How Can I do that. 我怎样才能做到这一点。

you can't. 你不能。 you are using @OneToOne annotation, this tells hibernate that the run_id exist in the camel table. 您正在使用@OneToOne批注,这告诉hibernate camel表中存在run_id You must drop the constraint. 您必须删除约束。

I solved by setting the field to null like this. 我通过将字段设置为null来解决此问题。

ExtractionConfig extractionConfig = new ExtractionConfig();
extractionConfig.setRrunHistoryByLastRunId(null);
extractionConfigRepository.save(extractionConfig);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM