gpt4 book ai didi

java - Cascade ALL 未按预期工作

转载 作者:行者123 更新时间:2023-12-01 10:38:31 31 4
gpt4 key购买 nike

我有以下实体:

@Entity
@Table(name = "BOOKS")
public class Book {

@Id
@GeneratedValue(generator = "SEQUENCE_UID", strategy = GenerationType.SEQUENCE)
private Long id;

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "BOOK_ID")
private List<Page> pages = new ArrayList<>();
...
...

public List<Page> getPages() {
return Collections.unmodifiableList(pages);
}

public void add(Page page){
this.pages.add(page);
}
}

@Entity
@Table(name = "PAGES")
public class Page {

@Id
@GeneratedValue(generator = "SEQUENCE_UID", strategy = GenerationType.SEQUENCE)
private Long id;

@Column(name = "COLOR", nullable = false)
private String color;

...
...
}

正如您所看到的,我在页面列表上使用 CascadeType.ALL,实际上,当我尝试创建一本新书时,我可以看到以下查询:

INSERT INTO PAGES (ID, COLOR) VALUES (?,?)

但是后来我得到了这个异常:

Internal Exception: org.postgresql.util.PSQLException: ERROR: null value in column "book_id" violates not-null constraint

我正在使用 EclipseLink 和 Spring-Data,这就是我创建新书的方式:

Page page = new Page();
page.setColor("RED");
Book book = new Book();
book.add(page);
bookRepository.save(book);

我在这里缺少什么?

最佳答案

问题是这两个类都不会自动生成它们的 id,因此您会看到错误

ERROR: null value in column "book_id" violates not-null constraint

JPA 实体对象在持久化时不需要 null id。您可以手动设置:

Book book = new Book();
book.setId(1L);
bookRepository.save(book);

但是更容易使用生成的值(value)策略:

 @Entity 
@Table(name = "BOOKS")
public class Book {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="BOOK_SEQ")
@SequenceGenerator(name="BOOK_SEQ", initialValue=1, allocationSize=1, sequenceName="BOOK_SEQ")
private Long id;

...
...
}

@Entity
@Table(name = "PAGES")
public class Page {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="PAGE_SEQ")
@SequenceGenerator(name="PAGE_SEQ", initialValue=1, allocationSize=1, sequenceName="PAGE_SEQ")
private Long id;
...
...
}

此外,您需要在数据库上创建BOOK_SEQ和PAGE_SEQ,根据sql脚本可以更改的数据库,并非所有数据库都有序列,例如mysql不支持序列

如果您使用 postgresql 例如,您可以执行代码:

create sequence BOOK_SEQ start with 1 increment by 1 maxvalue 10000 minvalue 1 cycle; create sequence PAGE_SEQ start with 1 increment by 1 maxvalue 10000 minvalue 1 cycle;

关于java - Cascade ALL 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34548113/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com