Java JPA@OneToMany与@JoinTable双向-不包括插入查询中的所有列

Java JPA@OneToMany与@JoinTable双向-不包括插入查询中的所有列,java,hibernate,jpa,jpa-2.0,Java,Hibernate,Jpa,Jpa 2.0,我试图用联接表持久化一个一元多父子关系,但在联接表的insert sql中只考虑一列(两列中的一列) 它不包括ITEM_ID列,并且由于下面的错误 java.sql.SQLIntegrityConstraintViolationException:ORA-01400:无法在“投标系统所有者”、“项目投标关系”、“项目ID”中插入NULL 这里有两个问题: public Item addBid(BidDTO bidDTO) { Item item = itemsRepository.fi

我试图用联接表持久化一个一元多父子关系,但在联接表的insert sql中只考虑一列(两列中的一列)

它不包括
ITEM_ID
列,并且由于下面的错误

java.sql.SQLIntegrityConstraintViolationException:ORA-01400:无法在“投标系统所有者”、“项目投标关系”、“项目ID”中插入NULL

这里有两个问题:

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;
}
  • 为什么它只包括
    ITEM\u BIDS\u REL
    联接表的插入查询中的
    BID\u ID
  • 是设计联接表的正确方法,就像我将
    BID\u ID
    adpk、FK和
    ITEM\u ID
    保留为FK一样
  • 用例: 参考《Java持久化与Hibernate》一书中的“在线操作(投标)系统”示例。 一个项目可以有很多出价

    项目表

  • 项目标识PK
  • 名字
  • 初始金额
  • 项目投标表

  • 投标编号PK
  • 数量
  • 项目\u出价\u重新加入表

  • 投标ID主键(项目投标表中的FK)
  • 物料标识不为空(物料表中的FK)
  • 实体类:

    项目类别

        @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;
    }
    
    public Item addBid(BidDTO BidDTO){
    Item=itemsRepository.findOne(bidDTO.getItemId());
    Bid=Bid.builder()
    .项目(项目)
    .biddAmount(bidDTO.getbiddAmount())
    .build();
    if(item.getBids()==null){
    item.setBids(新的HashSet());
    }
    item.getBids().add(bid);
    保存(bid);
    itemsRepository.save(项目);
    退货项目;
    }
    
    @Richard Telford,这个问题还没有引起任何注意。我在提出这个问题时是否遗漏了一些东西,比如正确的标签或任何w.r.t.statck溢出过程。实际上,我没有在堆栈溢出上提出问题的经验,这是我这边的第一个问题。@Richard Telford,这个问题还没有引起任何注意。我在提出这个问题时是否遗漏了一些东西,比如正确的标签或任何w.r.t.statck溢出过程。实际上,我没有关于堆栈溢出的问题的经验,这是我这边的第一个问题。