У меня есть две таблицы:
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, а Section
имеет составной первичный ключ для DOC_ID и SECTION_NUM.
SECTION_NUM — это локально (приложением) генерируемый порядковый номер, начиная с нового для каждого документа.
Мои классы сущностей выглядят следующим образом:
@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;
}
При вставке нового документа и связанного с ним раздела я делаю следующее:
Document doc = new Document();
Section section = new Section();
section.setDocument(doc);
section.setSectionNum(1);
entityManager.persist(doc);
При сохранении я получаю исключение о том, что NULL не разрешен для столбца SECTION_NUM. Я использую OpenEJB (который полагается на OpenJPA за кулисами для модульного тестирования) и обнаружил, что при выполнении кода OpenJPA он успешно сохраняет объект Document, но когда дело доходит до объекта Section, он рефлективно создает новый экземпляр и устанавливает все со значением null, поэтому потеря значения sectionNum перед связыванием с объектом Document сохранялась ранее.
К сожалению, я не могу изменить схему БД, так как это устаревшая система. Кто-нибудь делал что-то подобное и заработало?