@Entity @Table(name = "test2") @Data @Getter @Setter @NoArgsConstructor(access = PROTECTED, force = true) @AllArgsConstructor(access = PRIVATE) @Builder public class Test2 {
@EmbeddedId
@EqualsAndHashCode.Include
@ToString.Include
ImpactKey id;
@NonNull
@Column(name = "object_id", updatable = false, insertable = false)
private UUID object;
@ManyToOne(fetch = FetchType.LAZY)
@EqualsAndHashCode.Exclude
@ToString.Exclude
@JoinColumn(name = "object_id", referencedColumnName = "guid", updatable = false, insertable = false)
private Test1 test1Id;
在我的测试中我做:
@Autowired private EntityManager db;
Test1 test1 = createDefTest1();
//I do set guid from Test1 in test1Id from Test2
Test2 test2 = createDefTest2(test1);
db.persist(test1);
db.persist(test2);
//some code
Object t = someJpa.findById(someid);
当我称呼FindbyId时,EntityManager DB开始重置后gre数据库中的状态,在我看到的日志中
如果之前,在迁移之前,test1首先始终插入父母,现在首先插入test2,我得到了一个外键约束错误,即test1中某些ID不存在
为什么插入顺序会改变?我该如何解决?
few方法可以解决此问题:
@OneToMany(mappedBy = "test1Id", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private Set<Test2> contacts = new HashSet<>();
db.persist(test1);
db.flush(); // Force flush to ensure Test1 is in the database
db.persist(test2);
3。使用@mapsid对儿童实体
@ManyToOne(fetch = FetchType.LAZY)
@MapsId("objectId") // assuming your embedded ID has an objectId field
@JoinColumn(name = "object_id")
private Test1 test1Id;
检查冬眠配置在Hibernate 6中,检查您是否更改了与订单操作或批处理处理相关的任何设置。该物业可能在这里很重要。