Java 如何在jackrabbit中正确添加可版本化的节点
我在tomcat wtih java 1.7上的j2ee应用程序中使用Jackrabbit 2.0。 我想至少在根节点下设置一个usernode,在该节点下设置一个可版本的lessonnode,在该节点下设置一个可版本的filecardnode。每个节点都是lesson和filecardnode,其中包含一个序列化对象作为属性。 我能够还原每个单独的节点,但我希望在给定版本的lessonnode下接收到一个frozennode,该节点保存到该时间的所有filecardnodes…但是如果我搜索该节点上的子节点,则没有子节点。 任何关于我做错了什么的建议,或者我可能理解规格中的错误 以下是我保存节点的方式:Java 如何在jackrabbit中正确添加可版本化的节点,java,jakarta-ee,nodes,versioning,jackrabbit,Java,Jakarta Ee,Nodes,Versioning,Jackrabbit,我在tomcat wtih java 1.7上的j2ee应用程序中使用Jackrabbit 2.0。 我想至少在根节点下设置一个usernode,在该节点下设置一个可版本的lessonnode,在该节点下设置一个可版本的filecardnode。每个节点都是lesson和filecardnode,其中包含一个序列化对象作为属性。 我能够还原每个单独的节点,但我希望在给定版本的lessonnode下接收到一个frozennode,该节点保存到该时间的所有filecardnodes…但是如果我搜索该
public Node insertNewLessonNode(String userID, LessonEntity lessonEntity,
Session session) throws PathNotFoundException, RepositoryException,
IOException {
//that adds a usernode if not there already
Node userNode = handleLessonParentNodes(lessonEntity, userID, session);
Node lessonNode = userNode.addNode(LESSON
+ lessonEntity.getID(), "nt:unstructured");
lessonNode.addMixin("mix:versionable");
lessonNode.setProperty("id", lessonEntity.getID());
lessonNode.setProperty("data", JRUtils.serializObject(lessonEntity));
session.save();
session.getWorkspace().getVersionManager()
.checkin(lessonNode.getPath());
System.out.println("Lesson "
+ session.getWorkspace().getVersionManager()
.getBaseVersion(lessonNode.getPath()));
return lessonNode;
}
public Node insertNewFileCardNode(Node lessonNode,
FileCardEntity fileCardEntity, String userID, Session session)
throws UnsupportedRepositoryOperationException,
RepositoryException, IOException {
nodeCheckout(lessonNode, session);
Node fileCardNode = null;
fileCardNode = lessonNode.addNode(FILECARD + fileCardEntity.getID(),
"nt:unstructured");
fileCardNode.addMixin("mix:versionable");
fileCardNode
.setProperty("data", JRUtils.serializObject(fileCardEntity));
session.save();
session.getWorkspace()
.getVersionManager()
.checkin(
lessonNode.getPath() + DEL + FILECARD
+ fileCardEntity.getID());
System.out.println("FileCard "
+ session
.getWorkspace()
.getVersionManager()
.getBaseVersion(
lessonNode.getPath() + DEL + FILECARD
+ fileCardEntity.getID()));
return fileCardNode;
}
我就是这样恢复它的:
public void restoreLesson(String lessonId,
String userID, String versionName) throws SQLException, VersionException, ItemExistsException, UnsupportedRepositoryOperationException, LockException, InvalidItemStateException, RepositoryException {
Session session = JRRepository.getInstance().getSession();
String userNodePath = session.getRootNode().getNode(USER + userID)
.getPath();
String absPath = userNodePath + DEL + LESSON+lessonId;
VersionHistory versionHistory = session.getWorkspace()
.getVersionManager().getVersionHistory(absPath);
VersionIterator iterator = versionHistory.getAllVersions();
LessonEntity lessonEntity = null;
while (iterator.hasNext()) {
Version version = (Version) iterator.next();
if (version.getName().equals(versionName)) {
Node frozenNode = version.getFrozenNode();
Value value = frozenNode.getProperty("data").getValue();
//here i expect a few of my filecardnodes...but theres nothin...
//i tried already with differened searchpatterns
for (NodeIterator iterator3 = frozenNode.getNodes("nt:unstructured"); iterator3.hasNext();) {
Node type = (Node) iterator3.next();
System.out.println(type.getName());
}
Object ob = JRUtils.deSerializeObject(value.getBinary());
lessonEntity = (LessonEntity) ob;
}
}
session.getWorkspace().getVersionManager()
.restore(absPath, versionName, false);
List<LessonEntity> updateList = new ArrayList<LessonEntity>();
lessonEntity.setLastModified(new Date());
updateList.add(lessonEntity);
lessonDao.updateLessons(updateList, userID);
session.logout();
}
public void restoreLesson(字符串lessonId,
字符串userID,字符串versionName)引发SQLException,VersionException,ItemExistsException,UnsupportedPositionOperationException,LockException,InvalidItemStateException,RepositoryException{
会话会话=JRRepository.getInstance().getSession();
字符串userNodePath=session.getRootNode().getNode(用户+用户ID)
.getPath();
字符串absPath=userNodePath+DEL+LESSON+lessonId;
VersionHistory VersionHistory=session.getWorkspace()
.getVersionManager().getVersionHistory(absPath);
VersionIterator迭代器=versionHistory.getAllVersions();
LessonEntity LessonEntity=null;
while(iterator.hasNext()){
Version Version=(Version)迭代器.next();
if(version.getName().equals(versionName)){
Node frozenNode=version.getFrozenNode();
Value-Value=frozenNode.getProperty(“数据”).getValue();
//在这里,我期待我的一些filecardnodes…但是没有。。。
//我已经尝试了不同的搜索模式
for(NodeIterator迭代器3=frozenNode.getNodes(“nt:非结构化”);迭代器3.hasNext();){
节点类型=(节点)迭代器3.next();
System.out.println(type.getName());
}
Object ob=JRUtils.deSerializeObject(value.getBinary());
lessonEntity=(lessonEntity)ob;
}
}
session.getWorkspace().getVersionManager()
.restore(absPath,versionName,false);
List updateList=new ArrayList();
lessonEntity.setLastModified(新日期());
updateList.add(lessonEntity);
更新列表(updateList,userID);
session.logout();
}
任何帮助都将不胜感激…提前感谢 如果希望能够检索已版本化节点的子节点,则必须仅使父节点可版本化
当您将父级和子级设置为可设置版本时,它们存储为单独的
版本
s,因此它们之间没有链接。如果您确实想使它们都具有版本性,那么您必须添加自己的属性,以便将特定版本的filecardnode
与特定版本的lessionnodeThx链接起来……我已经通过从子节点获取自己的版本历史,找到了解决该问题的方法。虽然parentnode知道他的孩子的版本,但没有……也许你也有一个关于这个问题的提示:我知道。首先,也许你愿意接受我的答案,或者提供你自己的答案,因为问题已经解决;)