Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在jpa中添加外键列值为空的行_Java_Mysql_Hibernate_Jpa_Spring Data Jpa - Fatal编程技术网

Java 在jpa中添加外键列值为空的行

Java 在jpa中添加外键列值为空的行,java,mysql,hibernate,jpa,spring-data-jpa,Java,Mysql,Hibernate,Jpa,Spring Data Jpa,若一行的列是外键且其值为空,那个么如何将该行添加到表中 如何使用JPA实现这一点 public class ExtractionConfig { private RunHistory runHistoryByLastRunId; @OneToOne @JoinColumn(name = "last_run_id", referencedColumnName = "run_id", insertable = false, updatable = false) public

若一行的列是外键且其值为空,那个么如何将该行添加到表中

如何使用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;
    }
}
这就是我保存它的方式

ExtractionConfig extractionConfig = new ExtractionConfig();
extractionConfigRepository.save(extractionConfig);
数据库表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;
我得到了一个例外

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

我想将
ExtractionConfig
对象保存到没有/null
RunHistory
引用的数据库中。我该怎么做呢

你不能。您正在使用
@OneToOne
注释,这告诉hibernate
运行id
存在于
camel
表中。您必须删除该约束。

我通过如下方式将字段设置为
null来解决此问题

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

那么就不会有一对一的关系了