java - 如何在data.sql初始化中初始化spring-data-jpa中的一对多关系

标签 java spring spring-data-jpa

我有一个 spring-dta-jpa 应用程序。在运行一些 JUnit 测试之前,我想填充嵌入式 H2 数据库。我知道这可以通过将 data.sql 文件放入我的 Maven 项目的资源文件夹中来完成,如 spring 文档中所述。

http://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html

我的问题是:如何初始化 data.sql 文件中的父子(“一对多”)关系?当我想插入子实体时,我不知道父实体的 ID。

最佳答案

如果您使用 Long 作为 ID(而不是 UUID),那么您的 ID 更有可能从 1 开始,并与 data.sql 中出现的记录匹配相同的顺序

实体关系示例:

@Entity
public class Document {

    @Id
    @GeneratedValue
    private Long id;

    @Column(nullable = false, length=256)
    @Size(min=1,max=256)
    private String name;

    private String code;

    private Date date;

    @OneToMany(mappedBy = "document", cascade = CascadeType.ALL)
    @JsonManagedReference
    private List<DocumentItem> documentItems;


@Entity(name="document_item")
public class DocumentItem {

    @Id
    @GeneratedValue
    private Long id;

    @Column(nullable = false, length=256)
    private String name;
    private BigDecimal price;

    @ManyToOne(optional = false)
    @JsonBackReference
    private Document document;

在上面的示例中,列 document_id 将被添加到 document_item 实体中。

您还可以使用 JoinColumn 注解指定用于关系的列名称,例如:

@ManyToOne(optional = false)
@JoinColumn(name = "publisher_id")
private Publisher publisher;

初始化脚本示例:

INSERT INTO document(name, code) VALUES ('Test Document 1', 'TD-1'); 
INSERT INTO document(name, code) VALUES ('Test Document 2', 'TD-2');
INSERT INTO document(name, code) VALUES ('Test Document 3', 'TD-3');
INSERT INTO document(name, code) VALUES ('Test Document 4', 'TD-4');
INSERT INTO document(name, code) VALUES ('Test Document 5', 'TD-5');

INSERT INTO document_item(document_id, name, price) VALUES (2,'Test Item 2.A', 100.45); 
INSERT INTO document_item(document_id, name, price) VALUES (2,'Test Item 2.B', 30.45);
INSERT INTO document_item(document_id, name, price) VALUES (2,'Test Item 2.C', 564);
INSERT INTO document_item(document_id, name, price) VALUES (4,'Test Item 4.A', 1);
INSERT INTO document_item(document_id, name, price) VALUES (4,'Test Item 4.B', 456);
INSERT INTO document_item(document_id, name, price) VALUES (5,'Test Item 5.A', 67);
INSERT INTO document_item(document_id, name, price) VALUES (2,'Test Item 2.D', 98);

关于java - 如何在data.sql初始化中初始化spring-data-jpa中的一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41430166/

相关文章:

java - 限制一定数量的客户端连接到服务器

Java - 从另一个类输入字符串时出现 MalformedURLException,但在粘贴相同的字符串时不会出现异常

mysql - Spring中调试 "org.springframework.beans.factory.BeanCreationExcpetion"错误

spring-boot - 如何解决 Spring Boot 3 和 Hibernate Search 的依赖冲突

java - Spring Data JPA 到深入而奇怪的映射

java - Spring Boot 中的 RestController 中未找到 404

java - 失败消息仅适用于 jmeter 中的失败案例

java - Java中如何实现时间的加法?

spring - Spring MVC 和 Spring Boot 的区别

java - 获取 "Deadlock found when trying to get lock; try restarting transaction"