Java 对两个以上列的组合的唯一约束

Java 对两个以上列的组合的唯一约束,java,hibernate,spring-boot,Java,Hibernate,Spring Boot,我有两张桌子书和页 我正试图在它们之间建立一个双向的一对多关系 页面对无法正常工作的多个列具有唯一约束。当我插入带有唯一页面项目的book_项目时,它的工作方式与预期的一样,但是当我尝试删除也应该删除页面的book_项目时,我得到了唯一的约束冲突异常,我真的不理解。 我正在使用jpa存储库执行插入/删除 当我删除@UniqueConstraint时,删除起作用,但约束也不起作用,所以我真的不明白我做错了什么 @Entity @Table(name = "book") @NoA

我有两张桌子 我正试图在它们之间建立一个双向的一对多关系

页面对无法正常工作的多个列具有唯一约束。当我插入带有唯一页面项目的book_项目时,它的工作方式与预期的一样,但是当我尝试删除也应该删除页面的book_项目时,我得到了唯一的约束冲突异常,我真的不理解。 我正在使用jpa存储库执行插入/删除

当我删除@UniqueConstraint时,删除起作用,但约束也不起作用,所以我真的不明白我做错了什么

@Entity
@Table(name = "book")
@NoArgsConstructor
@RequiredArgsConstructor
public class Book implements Serializable {

    @Id
    @GeneratedValue(generator = "book_uuid")
    @GenericGenerator(name = "book_uuid", strategy = "org.hibernate.id.UUIDGenerator")
    @Column(name = "id", updatable = false, nullable = false, columnDefinition = "VARCHAR(255)")
    @Type(type="uuid-char")
    @Getter
    private UUID id;


    @OneToMany(mappedBy = "book", cascade = CascadeType.ALL, orphanRemoval = true)
    @Getter
    @Setter
    private List<Page> pages;
}


@Entity
@Table(name = "page", uniqueConstraints = @UniqueConstraint(columnNames = {"book_id", "chapter", "volume", "name"}))
@NoArgsConstructor
@RequiredArgsConstructor
public class Page implements Serializable {

    @Id
    @GeneratedValue(generator = "page_uuid")
    @GenericGenerator(name = "page_uuid", strategy = "org.hibernate.id.UUIDGenerator")
    @Column(name = "id", updatable = false, nullable = false, columnDefinition = "VARCHAR(255)")
    @Type(type="uuid-char")
    @Getter
    private UUID id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "book_id", nullable = false)
    @Getter
    @Setter
    @NonNull
    private Book book;

    @Column(name = "chapter", nullable = false)
    @Getter
    @Setter
    private int chapter = 0;

    @Column(name = "volume", nullable = false)
    @Getter
    @Setter
    private int volume = 0;

    @Column(name = "name", nullable = false)
    @Getter
    @Setter
    @NonNull
    private String name;
}

// Code used for insertion/update /deletion


@Repository
public interface BookRepository extends JpaRepository<Book, UUID> {

}


public void test() {
    Book book = bookRepository.findById("9c7b2ab2-1c78-4e9f-adc5-99c7da42a7c6");

    List<Page> pages = IntStream.range(0, 5)
            .mapToObj(i -> new Page(book, "Page" + i, ".png"))
            .collect(Collectors.toList());
    book.setPages(pages);
    bookRepository.save(book);
    bookRepository.delete(book);

@实体
@表(name=“book”)
@诺尔格构装师
@所需参数构造函数
公共类图书实现了可序列化{
@身份证
@生成值(generator=“book_uuid”)
@GenericGenerator(name=“book\u uuid”,strategy=“org.hibernate.id.UUIDGenerator”)
@列(name=“id”,updateable=false,nullable=false,columnDefinition=“VARCHAR(255)”)
@类型(Type=“uuid char”)
@吸气剂
私有UUID;
@OneToMany(mappedBy=“book”,cascade=CascadeType.ALL,orphan=true)
@吸气剂
@塞特
私人名单页;
}
@实体
@表(name=“page”,uniqueConstraints=@UniqueConstraint(columnNames={“book_id”,“chapter”,“volume”,“name”}))
@诺尔格构装师
@所需参数构造函数
公共类页实现可序列化{
@身份证
@GeneratedValue(generator=“page_uuid”)
@GenericGenerator(name=“page_uuid”,strategy=“org.hibernate.id.UUIDGenerator”)
@列(name=“id”,updateable=false,nullable=false,columnDefinition=“VARCHAR(255)”)
@类型(Type=“uuid char”)
@吸气剂
私有UUID;
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“book\u id”,nullable=false)
@吸气剂
@塞特
@非空
私人书籍;
@列(name=“chapter”,nullable=false)
@吸气剂
@塞特
私人int章=0;
@列(name=“volume”,nullable=false)
@吸气剂
@塞特
私有整数卷=0;
@列(name=“name”,nullable=false)
@吸气剂
@塞特
@非空
私有字符串名称;
}
//用于插入/更新/删除的代码
@存储库
公共接口BookRepository扩展了JpaRepository{
}
公开无效测试(){
BookBook=bookRepository.findById(“9c7b2ab2-1c78-4e9f-adc5-99c7da42a7c6”);
列表页=IntStream.range(0,5)
.mapToObj(i->新页面(图书,“页面”+i,.png”))
.collect(Collectors.toList());
书籍设置页(页);
bookRepository.save(book);
bookRepository.delete(图书);
我收到的错误消息是:

org.springframework.dao.DataIntegrityViolationException:无法执行语句;SQL[n/a];约束[“UKOBQWYIY89PIIE6GP2NB4PVQ8W_INDEX_2 ON PUBLIC.PAGE(BOOK_ID,CHAPTER,VOLUME,NAME)值('acb0bb92-be2f-4dd3-9653-98f8d890e6b4',0,0,'Page0',1');SQL语句:

插入到页面(图书id、章节、扩展名、名称、卷、id)值(?、?、?、?、?、?)[23505-197];嵌套异常为org.hibernate.exception.ConstraintViolationException:无法执行语句


您可以尝试
deleteById

  deleteById("9c7b2ab2-1c78-4e9f-adc5-99c7da42a7c6");

我不会依赖层叠,因为它执行许多SQL查询,并删除您可能不希望删除的可能与其他实体相关的实体。而是通过执行您自己的DELETE语句或手动删除来管理它。有关更多信息,请参阅。请发布您添加/删除书籍的代码。我添加了一个简单的代码段,它是在执行插入和删除操作时,我会遇到文章中提到的错误。首先,将@Transactional放入存储库中,然后按照javaNoob的建议映射一个方法deleteById,并让级联孤立删除操作执行Tricker消息指示插入有问题,而不是DeleteBe try@JoinColumn(名称=“book_id”,nullable=false,insertable=true)它与deleteById一起工作,但正如其他人建议的那样,我必须在我的方法中添加@Transnational才能与delete(book)一起工作