【发布时间】:2010-11-30 00:27:20
【问题描述】:
我有两张桌子:
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 是本地(应用程序)生成的序列号,从每个文档的新开始。
我的实体类如下所示:
@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);
在持久化时,我收到一个异常,指出列 SECTION_NUM 不允许使用 NULL。 我正在使用 OpenEJB(它在幕后依赖 OpenJPA 进行单元测试),并在单步执行 OpenJPA 代码时发现它成功地保留了 Document 对象,但是当涉及到 Section 对象时,它反射性地创建了一个新实例并设置了所有字段为空,因此在将其链接到 Document 对象之前丢失了 sectionNum 值。
很遗憾,我无法更改数据库架构,因为它是一个遗留系统。 有没有人做过类似的事情并让它发挥作用?
【问题讨论】:
标签: jpa foreign-keys sequence composite-key surrogate-key