我正在使用eclipselink JPA创建一个应用程序,我使用HistoryPlicy来创建历史数据。每件事都运行正常,但我遇到了将blob数据复制到历史表的问题。
@Entity
@Customizer(AttachmentHistoryPolicy.class)
@Table(name = "STAFF_ATTACHMENT", catalog = "", schema = "OIA")
public class Attachment implements Serializable {
@Id
private Long id;
@Basic(optional = false)
@NotNull
@Lob
@Column(name = "CONTENTS")
private byte[] contents;
// getters and setters
}
public class AttachmentHistoryPolicy implements DescriptorCustomizer {
@Override
public void customize(ClassDescriptor cd) throws Exception {
HistoryPolicy policy = new HistoryPolicy();
policy.addHistoryTableName("HIST_STAFF_ATTACHMENT");
policy.addStartFieldName("HIST_START_DATE");
policy.addEndFieldName("HIST_END_DATE");
policy.setShouldHandleWrites(true);
//policy.useDatabaseTime();
cd.setHistoryPolicy(policy);
}
}
行被插入历史表中,但是空blob !!!
有没有办法使用eclipselink HistoryPolicy来处理这个问题?
编辑:
以下是eclipselink生成的sql语句
BEGIN INSERT INTO OIA.STAFF_ATTACHMENT (ID, CONTENT_TYPE, CONTENTS, FILE_NAME, FILE_SIZE, OWNER, STAFF_MEMBER) VALUES (?, ?, ?, ?, ?, ?, ?) RETURNING CONTENTS INTO ?; END;
SELECT CONTENTS FROM OIA.STAFF_ATTACHMENT WHERE (ID = ?) FOR UPDATE
INSERT INTO HIST_STAFF_ATTACHMENT (ID, CONTENT_TYPE, CONTENTS, FILE_NAME, FILE_SIZE, OWNER, STAFF_MEMBER, HIST_START_DATE) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
SELECT CONTENTS FROM OIA.STAFF_ATTACHMENT WHERE (ID = ?) FOR UPDATE
bind => [1 parameter bound]
注意用于更新的选择内容的两个相同的语句(这两个语句用于STAFF_ATTACHMENT表)
答案 0 :(得分:1)
对于Oracle平台的LOB定位器支持,EclipseLink支持历史记录似乎是一个问题。
请记录一个错误,但如果您使用的是Oracle 11,那么我认为LOB现在可以在没有定位器的情况下工作,因此不再需要解决方法。尝试将平台设置为Oracle11,或者只使用不使用定位器的OraclePlatform。