如何在Panache/JPA中插入带自定义ID的明细记录
解决方案
1. 处理复合主键
DetailEntity使用masterId+detailId作为复合主键,需要显式定义主键类并通过@IdClass关联:
先创建主键类DetailId:
import java.io.Serializable; import java.util.Objects; public class DetailId implements Serializable { private Long masterId; private Long detailId; public DetailId() {} public DetailId(Long masterId, Long detailId) { this.masterId = masterId; this.detailId = detailId; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; DetailId detailId1 = (DetailId) o; return Objects.equals(masterId, detailId1.masterId) && Objects.equals(detailId, detailId1.detailId); } @Override public int hashCode() { return Objects.hash(masterId, detailId); } }
2. 修正实体类关联关系
修改MasterEntity
将单向@OneToMany改为双向关联,指定mappedBy让DetailEntity作为关联维护端,同时添加辅助方法保证关联一致性:
@Data @EqualsAndHashCode(callSuper = false) @Entity(name = "Master") public class MasterEntity extends PanacheEntity { @OneToMany(mappedBy = "master", orphanRemoval = true, cascade = CascadeType.ALL) private Set<DetailEntity> details = new HashSet<>(); public void addDetail(DetailEntity detail) { details.add(detail); detail.setMaster(this); } }
修改DetailEntity
添加@ManyToOne关联MasterEntity,并通过@IdClass绑定复合主键:
@Data @EqualsAndHashCode(callSuper = false) @Entity(name = "Detail") @IdClass(DetailId.class) public class DetailEntity extends PanacheEntityBase { @Id private Long masterId; @Id private Long detailId; @ManyToOne @JoinColumn(name = "masterId", insertable = false, updatable = false) private MasterEntity master; }
3. 修正测试代码
使用辅助方法维护双向关联,确保DetailEntity能获取到MasterEntity生成的ID:
@Test @Transactional public void testOneToMany() { MasterEntity master = new MasterEntity(); DetailEntity detail = new DetailEntity(); detail.setDetailId(1234567890123L); master.addDetail(detail); master.persist(); }
关键说明
- 双向关联必须同时维护两端关系,否则JPA无法自动将
Master的ID赋值给Detail的masterId - 复合主键类必须实现
Serializable,并重写equals和hashCode @JoinColumn的insertable和updatable设为false,避免JPA重复处理作为主键的masterId字段
内容的提问来源于stack exchange,提问作者Tilo
相关产品推荐
相关产品推荐

