0

bill と billSimpleentry の 2 つのテーブルと、それに対応する 2 つのエンティティ クラス Bill と BillSimpleEntry があります。

Bill と BillSimpleentry は 1 対 1 の関係にあります。請求書ごとに 1 つの billsimple エントリがあります。したがって、billsimplementry.billId には、bill.id と同じ対応する値があります。

SQL 構造:

CREATE TABLE `bill` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `title` varchar(100) DEFAULT NULL,
  .....
  .....
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_UNIQUE` (`id`),
  KEY `fk_bill_groups1_idx` (`groupId`),
  KEY `fk_bill_user1_idx` (`billPayerId`),
  CONSTRAINT `fk_bill_groups` FOREIGN KEY (`groupId`) REFERENCES `groups` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_bill_user` FOREIGN KEY (`billPayerId`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

CREATE TABLE `billsimpleentry` (
  `itemTitle` varchar(200) DEFAULT NULL,
  `itemDescription` text,
  `billId` bigint(20) NOT NULL,
  PRIMARY KEY (`billId`),
  KEY `fk_bill_idx` (`billId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

そのため、新しい「bill」オブジェクトが永続化されると、データベースに billsimpleentry 行も作成されます。

save(Bill newBill){
em.persist(newBill);
}

請求クラスの構造:

@Entity
@Table(name = "bill")
public class Bill implements GenericObject {

    private static final long serialVersionUID = -5660869020353250221L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)  
    private Long id;
    private String title;
    ....
    private Long groupId;
    private BigDecimal  billTotal;

    @OneToOne(cascade=CascadeType.ALL,fetch = FetchType.EAGER)
    @PrimaryKeyJoinColumn
    private BillSimpleEntry billSimpleEntry;
   ... getters & setters...
}

BillSimpleEntry:

@Entity
@Table(name="billsimpleentry")
public class BillSimpleEntry  implements GenericObject{

    @Id
        @GeneratedValue(strategy = GenerationType.AUTO)  
        private Long billId;
        @Column(columnDefinition="TEXT")
    private String itemDescription;


         @OneToMany(cascade=CascadeType.ALL,mappedBy="billSimpleEntryId",fetch = FetchType.EAGER)
    private List<SimpleUserIdAndLiableCost> simpleUserIdAndLiableCost = new ArrayList<SimpleUserIdAndLiableCost>();
        ... getters & setters...

}

永続化を試みた newBill obj データは次のとおりです。

{
   "id":null,
   "title":"",
   "billDate":null,
   "billPayerId":6,
   "notes":null,
   "billCreaterId":null,
   "groupId":3,
   "billTotal":null,
   "billSimpleEntry":{
      "billId":null,
      "itemDescription":null,
      "simpleUserIdAndLiableCost":[
         {
            "userId":6,
            "liableCost":"50",
            "id":null,
            "billSimpleEntryId":null,
            "user":{
               "id":null,
               "fName":"doe",
               "lName":"doe"
            },
            "isActive":true
         },
         {
            "userId":7,
            "liableCost":"50",
            "id":null,
            "billSimpleEntryId":null,
            "user":{
               "id":null,
               "fName":"doe",
               "lName":"doe"
            },
            "isActive":true
         },
         {
            "userId":8,
            "liableCost":"50",
            "id":null,
            "billSimpleEntryId":null,
            "user":{
               "id":null,
               "fName":"doe",
               "lName":"doe"
            },
            "isActive":true
         }
      ],
      "itemDescriptionId":2
   },
   "billItemEntry":[

   ],
   "userId":null
}

しかし問題は、billsimpleentry.billId の値を bill.id と同じ値に設定する必要があるため、em.persist(Bill) が失敗することです。この問題を解決するにはどうすればよいですか? テーブル構造またはテーブルの自動 ID 生成戦略を更新する必要があるようです。任意の洞察をいただければ幸いです。

4

1 に答える 1

0

申し訳ありませんが、もっと明確にする必要があります。その JSON をどのように作成したかはわかりませんが、その中には"billId":nullがあります。親 ID を設定する必要があります。したがって、それが JSON の場合は、永続化する前にそれを処理し、それに親 ID を添付します。保存または永続化によって、親 ID が子 ID に自動的にアタッチされないようにする必要があります。

于 2013-10-25T17:37:27.120 に答える