我有兩個表 - 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相同的值。我應該如何解決這個問題?看起來好像我需要更新我的表格結構或表格自動生成策略。任何見解,將不勝感激。
您的BillSimpleEntry創建並鏈接到newBill在哪裏?請顯示代碼。 – baltov
@baltov newBill是Bill類的一個實例。 Bill類具有BillSimpleEntry類型的屬性billSimpleEntry。所以newBill也擁有屬性billsimpleentry。那有意義嗎?我還編輯了原文,以顯示newBill的內容。 – user6123723