두 개의 테이블 - billbillSimpleentry와 두 개의 해당 엔티티 클래스 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 (빌) 실패 왜냐하면 billsimpleentry.billId 값은 bill.id와 동일한 값으로 채워 져야하기 때문입니다. 이 문제를 어떻게 해결해야합니까? 내 테이블 구조 또는 테이블 자동 ID 생성 전략을 업데이트해야하는 것처럼 보입니다. 모든 통찰력은 인정 될 것이다.
귀하의 BillSimpleEntry는 어디에서 생성되어 newBill에 링크되어 있습니까? 코드를 보여주십시오. – baltov
@baltov newBill은 Bill 클래스의 인스턴스입니다. Bill 클래스에는 BillSimpleEntry 유형의 billSimpleEntry 속성이 있습니다. 따라서 newBill은 billsimpleentry 속성을 보유합니다. 말이 돼? 또한 newBill의 내용을 보여주기 위해 원래 게시물을 편집했습니다. – user6123723