JPA @OneToMany与@JoinTable双向 - 不包括插入查询

时间:2017-10-07 13:24:41

标签: java hibernate jpa jpa-2.0

我试图将一个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")

这里有两个问题:

  1. 为什么它只在BID_ID联接表的INSERT查询中包含ITEM_BIDS_REL列。
  2. 设计JOIN TABLE的正确方法就像我将BID_ID广告PK,FK和ITEM_ID保持为FK一样。
  3. 用例: 参考"在线行动(竞标)系统"例子来自Java Persistence with Hibernate一书。 一个项目可以有很多投标。

    ITEM表

    1. ITEM_ID PK
    2. NAME
    3. INITIAL_AMOUNT
    4. ITEM_BIDS表

      1. BID_ID PK
      2. 金额
      3. ITEM_BIDS_REL加入表

        1. BID_ID PK(来自ITEM_BIDS表的FK)
        2. ITEM_ID NOT NULL(来自ITEM表的FK)
        3. 实体类:

          项目类

              @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;
          }
          

0 个答案:

没有答案