6

要求之一是使用新内容更新文档并删除旧文档。前一个文档的文档 ID 和其他属性应该指向具有新内容的新文档。

有任何示例片段可以做同样的谢谢。

4

1 回答 1

7

我不太明白您是否需要创建新文档或现有文档的新版本。属性可以自动复制到新创建的版本,因此在这里使用版本控制似乎更自然。要做到这一点:

// check out the document 
Document currentVersion = .. // reference to existing document 
currentVersion.checkout(ReservationType.EXCLUSIVE, null, null, null);
currentVersion.save(RefreshMode.REFRESH);

// obtain the reservation object (new version in progress)
newVersion = (com.filenet.api.core.Document) documentObject.get_Reservation();

// set content
InputStream inputStream = .. // obtain input stream with content
ContentElementList contentElements = Factory.ContentElement.createList();
ContentTransfer contentTransfer = Factory.ContentTransfer.createInstance();
contentTransfer.setCaptureSource(inputStream);
contentTransfer.set_RetrievalName("content name");
contentTransfer.set_ContentType("proper MIME type");
contentElements.add(contentTransfer);
newVersion.set_ContentElements(contentElements);
newVersion.checkin(AutoClassify.DO_NOT_AUTO_CLASSIFY, CheckinType.MINOR_VERSION);
newVersion.save(RefreshMode.NO_REFRESH);

// deleting obsolete version
currentVersion.delete();
currentVersion.save(RefreshMode.NO_REFRESH);

指定用于传输到保留的属性(所有非对象属性的默认模式)将使其进入新版本,一旦它被持久化,它实际上就是保留对象。

需要注意的一点是,新版本的 ID 不能与前一个版本相同,因为每个版本都是不同的对象。要使用相同的 ID,您需要创建一个具有此 ID 的新文档并手动复制属性(在保留新文档之前删除旧文档)。

更新

关于必须包含多个对象的原子更新,您有两个选择:

  1. 批量更新对象
  2. 使用客户端启动的 JTA 事务(如果使用 EJB 传输连接)

您可以在文档中阅读这些内容:批处理概念客户端发起的事务

除非您有复杂的更新场景,否则使用批处理是您通常会使用的更传统的方式。

于 2014-02-04T13:53:49.810 回答