시퀀스 번호가 혼합 된 대용 키 :JPA, 외래 키와 내가 두 테이블을 가지고
DOCUMENT
--------
DOC_ID (PK)
.
.
.
SECTION
-------
DOC_ID (FK, PK)
SECTION_NUM (PK)
.
.
.
데이터베이스의 항목은 다음과 같습니다
문서 :
DOC_ID | . . .
--------------
1 | . . .
2 | . . .
섹션 :
DOC_ID | SECTION_NUM | . . .
---------------------------
1 | 1 | . . .
1 | 2 | . . .
1 | 3 | . . .
2 | 1 | . . .
Document
에는 DOC_ID에 생성 된 Id가 있고 Section
에는 DOC_ID 및 SECTION_NUM에 복합 기본 키가 있습니다.
SECTION_NUM은 모든 문서에 대해 새로 시작하는 로컬 (응용 프로그램) 생성 시퀀스 번호입니다. 다음과 같이
내 엔티티 클래스
보일 : 나는 NULL을 알리는 예외가되지 얻을 지속되면Document doc = new Document();
Section section = new Section();
section.setDocument(doc);
section.setSectionNum(1);
entityManager.persist(doc);
:
@Entity
@Table(name = "DOCUMENT")
public class Document implements java.io.Serializable {
@Id
@Column(name = "DOC_ID", nullable = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "DocIdSeq")
@SequenceGenerator(name = "DocIdSeq", sequenceName = "DOC_ID_SEQ", allocationSize = 1)
private Long docId;
}
@Entity
@Table(name = "SECTION")
@IdClass(SectionId.class)
public class Section implements java.io.Serializable {
@Id
@Column(name = "DOC_ID", nullable = false)
private Long docId;
@Id
@Column(name = "SECTION_NUM", nullable = false)
private Integer sectionNum;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "DOC_ID")
private Document document;
}
public class SectionId implements java.io.Serializable {
private Long docId;
private Integer sectionNum;
}
새로운 문서 및 관련 섹션을 삽입, 나는 다음을 수행 열 SECTION_NUM에 허용되었습니다. OpenEJB (OpenJPA를 사용하여 단위 테스트를위한 OpenJPA를 사용합니다)를 사용하고 OpenJPA 코드를 통해 Document 객체를 성공적으로 지속 할 때 발견되지만 Section 객체의 경우에는 새 인스턴스를 반영하여 만들고 모든 필드를 null로 설정하여 이전에 지속 된 Document 객체에 연결하기 전에 sectionNum 값을 잃어 버립니다.
불행히도 레거시 시스템이므로 DB 스키마를 변경할 수 없습니다. 아무도 비슷한 작업을 수행하고 작동시키지 않았습니까?
내 경우에 @MapsId가 유용 할 것이라고 생각합니까? https://stackoverflow.com/questions/46159867/ 원래 포스터의 주요 차이점은 ManyToOne 대신 OneToOne을 사용한다는 점입니다. – gouessej