2013-10-25 1 views
0

두 개의 테이블 - 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 생성 전략을 업데이트해야하는 것처럼 보입니다. 모든 통찰력은 인정 될 것이다.

+0

귀하의 BillSimpleEntry는 어디에서 생성되어 newBill에 링크되어 있습니까? 코드를 보여주십시오. – baltov

+0

@baltov newBill은 Bill 클래스의 인스턴스입니다. Bill 클래스에는 BillSimpleEntry 유형의 billSimpleEntry 속성이 있습니다. 따라서 newBill은 billsimpleentry 속성을 보유합니다. 말이 돼? 또한 newBill의 내용을 보여주기 위해 원래 게시물을 편집했습니다. – user6123723

답변

0

죄송합니다. 더 자세한 설명이 필요합니다. JSON을 어떻게 만들지는 모르겠지만,이 경우 "billId": null입니다. 상위 ID를 설정해야합니다. 따라서 JSON이라면 persist 전에 처리하고 부모 ID를 첨부하십시오. 저장하거나 계속해서 부모 ID를 하위 항목에 자동으로 첨부해서는 안됩니다.

+0

JSON은 사용자가 양식을 채울 때 프론트 엔드에 프로그래밍 방식으로 생성됩니다. JPA가 ID 생성을 데이터베이스에 위임하여이를 처리 할 것이라고 생각하면서 billId를 null로 의도적으로 설정했습니다. 그러나 제가 미리 bill1을 설정해야한다면, 데이터베이스 대신에 id를 설정하는 것이 잘못되지 않을까요? – user6123723

관련 문제