Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.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 字段';记录#u id';不';没有默认值-Spring JPA错误_Java_Spring_Hibernate_Spring Data Jpa_Entity Model - Fatal编程技术网

Java 字段';记录#u id';不';没有默认值-Spring JPA错误

Java 字段';记录#u id';不';没有默认值-Spring JPA错误,java,spring,hibernate,spring-data-jpa,entity-model,Java,Spring,Hibernate,Spring Data Jpa,Entity Model,我正在为已经开发的SpringBootWeb应用程序添加一个特性。具有子实体的主实体是记录。它有几个列/变量,我现在希望这些列/变量位于它自己的独立实体(CustomerOrder)中,并且与记录以一对一的关系存在。总结如下: 记录{ -事情1 -事情2 -事情3 } 现在正在成为: 客户订单{ -事情1 -事情2 -事情3 } 记录{CustomerOrder} 我对我的作品有一些问题。以下是CustomerOrder模型的相关关系数据: @Entity @Table(name="c

我正在为已经开发的SpringBootWeb应用程序添加一个特性。具有子实体的主实体是记录。它有几个列/变量,我现在希望这些列/变量位于它自己的独立实体(CustomerOrder)中,并且与记录以一对一的关系存在。总结如下:

记录{

-事情1

-事情2

-事情3

}

现在正在成为:

客户订单{

-事情1

-事情2

-事情3

}

记录{CustomerOrder}

我对我的作品有一些问题。以下是CustomerOrder模型的相关关系数据:

@Entity
@Table(name="customer_orders")
public class CustomerOrder {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    ... other columns

    @OneToOne(orphanRemoval = true, cascade = CascadeType.ALL, mappedBy="customerOrder", fetch = FetchType.EAGER)
    private Record record;


}
下面是记录模型的相关数据:

@Entity
@Table(name="records")
public class Record extends Auditable<String> implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    ... other columns

    @OneToOne
    @JoinColumn(name="customer_order_id", nullable = false, unique = true)
    private CustomerOrder customerOrder;
}
这至少对我来说是有意义的,因为我正试图保存依赖于记录对象的CustomerOrder对象,该记录对象尚未被持久化。那么,如何更改顺序和/或创建并持久化记录对象,以便将CustomerOrder对象保存到其中

另外,我正在使用mysql,这是我已经拥有的迁移脚本。我必须在这里为customer\u orders表添加一些内容吗

-- Add a sample user
INSERT IGNORE INTO users (first_name, last_name, email, password, enabled, role)
VALUES ('Sample', 'User', 'sample@email.com', 'sample password', true, 'ROLE_ADMIN');

-- Customer Reference Values
INSERT IGNORE INTO customers (name) VALUES ('value1');
INSERT IGNORE INTO customers (name) VALUES ('value2');
INSERT IGNORE INTO customers (name) VALUES ('value3');
INSERT IGNORE INTO customers (name) VALUES ('value4');
INSERT IGNORE INTO customers (name) VALUES ('value5');
INSERT IGNORE INTO customers (name) VALUES ('value6');
INSERT IGNORE INTO customers (name) VALUES ('value7');
INSERT IGNORE INTO customers (name) VALUES ('value8');
下面是Records表和CustomerOrders表的mysql脚本:

-- -----------------------------------------------------
-- Table `myapp`.`records`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `myapp`.`records` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `customer_order_id` BIGINT NOT NULL,
  `record_id` BIGINT NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `UK_7m7wsqy68b7omkufvckoqv2hf` (`customer_order_id` ASC) VISIBLE,
  INDEX `FKta31a9q1llknlo2n0jw741987` (`customer_id` ASC) VISIBLE,
  CONSTRAINT `FK3q3clytyrx7s8edp9ok821j3`
    FOREIGN KEY (`customer_order_id`)
    REFERENCES `myapp`.`customer_orders` (`id`),
  CONSTRAINT `FKta31a9q1llknlo2n0jw741987`
    FOREIGN KEY (`customer_id`)
    REFERENCES `myapp`.`customers` (`id`))
ENGINE = InnoDB
AUTO_INCREMENT = 27
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_0900_ai_ci;


-- -----------------------------------------------------
-- Table `myapp`.`customer_orders`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `myapp`.`customer_orders` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `record_id` BIGINT NOT NULL,
  `record_id_test` BIGINT NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `UK_ilew9pg8y4qnyhmjg38k1fev2` (`record_id_test` ASC) VISIBLE,
  INDEX `FK5rpb3u59bblj7h70wjr5mvb01` (`record_id` ASC) VISIBLE,
  CONSTRAINT `FK5rpb3u59bblj7h70wjr5mvb01`
    FOREIGN KEY (`record_id`)
    REFERENCES `myapp`.`records` (`id`),
  CONSTRAINT `FKk7a0g7djyhymr54ehoftkhyfw`
    FOREIGN KEY (`record_id_test`)
    REFERENCES `myapp`.`records` (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_0900_ai_ci;

如果我的理解是正确的,那么您在一对一关系中有一个双向映射。因此,
customer\u order
有一个
record\u id
列,
record
有一个
customer\u order\u id
列。这并不理想,而且hibernate不自动支持这种类型的映射。如果您仔细想想,如果两列都不可为空,则无法保存数据b/c您无法同时保存这两列。你必须先存一个

如果要保留此值,必须使其中一个值不可为null。然后保存一个,然后保存另一个,然后使用您现在生成的另一个id重新保存第一个

在这里,hibernate首先尝试保存
客户订单
,您声明的
客户订单id
的b/c在
记录
表中,不可为空。这是默认设置。我建议保留此项,并删除
customer\u orders
表中的另一个
record\u id

更新: 为了澄清,这里有一个解决方案。由于record_id和record_id_test不可为空,请在代码中设置它们的值,然后保存。它应该会起作用


如果我遗漏了什么,请提供更多信息,如基础数据库、模型中
记录id
列的位置等。

删除两个
记录id
列或为它们提供默认值。它们没有映射到实体中的任何内容,因此Hibernate没有将它们包含在insert语句中,这会导致失败,因为它们都配置为
notnull

我猜他们是想在
Record
CustomerOrder
之间保留引用,但这被映射到
customer\u order\u id

@JoinColumn(name="customer_order_id", nullable = false, unique = true)

在表创建脚本中,您似乎还在
RECORDS
表中包含一个名为
RECORD\u ID
的列。它已经有了标准的
ID
列来存储主键。不确定您是否真的需要
在那里记录\u ID
列。在表创建脚本中标记为NOTNULL且未设置默认值,因此会出现错误

查看表创建脚本中的约束,看起来应该将其命名为
CUSTOMER\u ID
,而不是
RECORD\u ID


请首先检查此项。

您的架构与您的实体不匹配。您的customer\u orders表不应包含record\u id列。指定记录表应具有列customer\u order\u id。使用注释明确定义此项:

@JoinColumn(name="customer_order_id", nullable = false, unique = true)
但是,您的注释位于另一侧

@OneToOne(orphanRemoval = true, cascade = CascadeType.ALL, mappedBy="customerOrder", fetch = FetchType.EAGER)
指示这只是使用另一个表中的外键的backref。从架构中删除该列。
我假设DB模式中的其他列(而不是实体)与用例无关,因为您有注释说您的实体有其他字段。但是,外键没有意义,并且它与您的实体不匹配。从数据库架构中删除该列。

为customerOrder变量上方的注释添加
@OneToOne(cascade=CascadeType.PERSIST)
基本上就是解决此问题所必须做的。这个小组中的另一个开发人员帮助了我。然后,我可以在POST方法中删除对CustomerOrder值的所有引用,只需在记录的PUT方法中为CustomerOrder设置一个setter即可。

可以共享表创建脚本吗?似乎您正在尝试创建一个在表创建过程中没有定义的自动递增字段。还有,您使用的是什么类型的数据库?我使用的是mysql,这是一个多人项目,所以我想表的迁移脚本就是我需要添加什么的地方。。。如果有的话。但我也在上面的答案中添加了这些信息。我还必须为customer_orders表添加一些内容吗?您也可以共享
SQL
脚本吗?@akortex91我已经添加了我认为与这两个表相关的脚本数据。我注意到“record_id_test”(记录id_测试),它似乎很可疑,我不确定它来自何处。更可疑的是
客户订单。record_id
,它不应该存在于
mappedBy
属性中。表是您自己创建的还是您在使用hibernate?谢谢您的回答,但我对您的建议有点困惑。为了澄清起见,你能在回答中准确地键入要更改的内容吗?我有点搞不清楚在这两个实体中应该更改什么,以及是否需要在saveRecord()方法中执行任何操作。
@JoinColumn(name="customer_order_id", nullable = false, unique = true)
@OneToOne(orphanRemoval = true, cascade = CascadeType.ALL, mappedBy="customerOrder", fetch = FetchType.EAGER)