我试图将一个OneToMany父子关系与Join表保持一致,但是在插入sql for join table时,只考虑一列(两个)。
insert into ITEM_BIDS_REL (BID_ID) values (?)
它不包括ITEM_ID
列,因为它低于错误。
java.sql.SQLIntegrityConstraintViolationException:ORA-01400:无法插入NULL(" BIDDING_SYSTEM_OWNER"。" ITEM_BIDS_REL"。" ITEM_ID")
这里有两个问题:
BID_ID
联接表的INSERT查询中包含ITEM_BIDS_REL
列。BID_ID
广告PK,FK和ITEM_ID
保持为FK一样。用例: 参考"在线行动(竞标)系统"例子来自Java Persistence with Hibernate一书。 一个项目可以有很多投标。
ITEM表
ITEM_BIDS表
ITEM_BIDS_REL加入表
实体类:
项目类
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable( name = "ITEM_BIDS_REL",
joinColumns = @JoinColumn(name = "ITEM_ID"),
inverseJoinColumns = @JoinColumn(name = "BID_ID"))
@JsonIgnore
private Set<Bid> bids;
出价等级
@ManyToOne(cascade = CascadeType.ALL)
@JoinTable(name = "ITEM_BIDS_REL",
joinColumns = {@JoinColumn(name = "BID_ID", insertable = false,
updatable = false)},
inverseJoinColumns = {@JoinColumn(name="ITEM_ID", insertable = false,
updatable = false)})
private Item item;
持久性逻辑:
public Item addBid(BidDTO bidDTO) {
Item item = itemsRepository.findOne(bidDTO.getItemId());
Bid bid = Bid.builder()
.item(item)
.bidAmount(bidDTO.getBidAmount())
.build();
if(item.getBids() == null){
item.setBids(new HashSet<>());
}
item.getBids().add(bid);
bidRepository.save(bid);
itemsRepository.save(item);
return item;
}