2013-10-25 22 views
0

我有兩個表 - Bill & billSimpleentry和兩個相應的實體類Bill & BillSimpleEntry。JPA與休眠問題時,堅持它們之間的一對一關係的實體

Bill和BillSimpleentry有一對一的關係。每張賬單都有一張賬單。因此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 */; 

因此,當一個新的「法案」對象持久化,也應該在數據庫中創建一個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 
} 

但問題是em.persist(Bill)失敗因爲billsimpleentry.billId值需要填充到與bill.id相同的值。我應該如何解決這個問題?看起來好像我需要更新我的表格結構或表格自動生成策略。任何見解,將不勝感激。

+0

您的BillSimpleEntry創建並鏈接到newBill在哪裏?請顯示代碼。 – baltov

+0

@baltov newBill是Bill類的一個實例。 Bill類具有BillSimpleEntry類型的屬性billSimpleEntry。所以newBill也擁有屬性billsimpleentry。那有意義嗎?我還編輯了原文,以顯示newBill的內容。 – user6123723

回答

0

對不起,但我需要更多的澄清。我不知道你是如何創建這個JSON的,但是他們是這個「billId」:null。您需要設置父ID。所以,如果這是JSON,請在繼續之前處理它,並將父ID附加到它。保存或保留不應將父標識自動附加到孩子。

+0

當用戶填寫表單時,JSON以編程方式在frontEnd中創建。我故意將billId設置爲null,因爲我認爲JPA將通過將id代委派給數據庫來處理它。但是如果我必須提前設置billId,那麼這不是錯誤的,因爲我現在正在設置ID而不是數據庫? – user6123723