2011-08-19 2 views
1

이상한 문제가 있습니다. DFC로 새 폴더를 만들면됩니다. 그러나 코드 (JUnit 또는 응용 프로그램 내부)를 실행할 때 폴더가 생성되지 않으며 놀랍게도 예외가 발생하지 않습니다. 그래서 나는 그 오류가 어딘가에 있다고 생각한다.DFC (Documentum)로 폴더 만들기

이 내 코드입니다 :

public void createNewFolder(String sFolderName, String sParentId) 
{ 
    IDfSession session = null; 
    try 
    { 
     session = getSession();  
     IDfFolder newFolder = (IDfFolder) session.newObject("dm_folder"); 
     newFolder.setObjectName(sFolderName); 
     newFolder.link(sParentId); 
     newFolder.save(); 
     String sDump = newFolder.dump(); 

     System.out.println("Folder ["+sFolderName+"] saved."); 
     System.out.println("Folder has id ["+newFolder.getId("r_object_id")+"]"); 
    } 
    catch (DfException e) 
    { 
     e.printStackTrace(); 
    } 
    finally 
    { 
     m_sessionManager.release(session); 
    } 

내가 반환에 sysobject ID를 받고 있어요,하지만 난 DQL 문을 가져올려고 할 때 나는 그것을 찾을 수 없습니다.

나는 dql create query를 실행하여 폴더를 생성하려고했습니다. 이것은 JUnit이나 실행중인 응용 프로그램에서는 작동하지 않지만 수동으로 실행하면 간단하게 작동합니다.

이것은 내하는 getSession() 메소드

private IDfSession getSession() 
{ 
    try 
    { 
     if (m_sessionManager == null) 
     { 
       return establishConnection(); 
     } 
     else 
     { 
      return m_sessionManager.getSession(m_sRepository); 
     } 
    } 
    catch (DfException e) 
    { 
     e.printStackTrace(); 
    } 
    return null; 
} 

이 뭘까요?

+0

dfc.properties가 확인하려는 동일한 인스턴스를 가리키고 있는지 확인 했습니까? 당신의 코드에서'newFolder.dump()'라인이 당신에게 어떤 것을 돌려 줄 수 있습니까? 나는 당신이 그것을 인쇄하는 곳을 보지 못한다. ID를 돌려 주면 생성됩니다. –

+0

예, 실제로 디버깅 할 때 ID를 다시 얻습니다. 하지만 실행 된 직후, DQL로 가져 오기 위해 노력하고 있지만 어떤 이유로 든 거기에 있지 않습니다 ... –

+2

어떤 종류의 DFC 트랜잭션을 사용하고 있습니까? 그게 먼저 커밋해야합니다. 동일한 트랜잭션 내에서도 DQL 트랜잭션을 DQL과 혼합 할 때 이상한 동작을 보았습니다. 내 유일한 다른 제안은 Acl에 대해 실제로 권한이 있는지 확인하기 위해 Acl을 다시 확인한다는 것입니다. –

답변

0

unicron의 의견에 감사드립니다. 이것은 실제로 문제를 해결하게합니다. 질문에 게시하지 않은 제 establishConnection() 메서드에서 실제로 beginTransaction()을 사용했습니다. 그 문제를 해결하고 모든게 잘 작동.

public IDfSession establishConnection(String sUserName, String sPassword, String sRepository) throws DfException 
{ 
    System.out.println("Login"); 
    IDfClientX clientX = new DfClientX(); 

    IDfClient localClient = clientX.getLocalClient(); 
    IDfSessionManager sessionManager = localClient.newSessionManager(); 
    IDfLoginInfo loginInfo = new DfLoginInfo(); 
    loginInfo.setUser(sUserName); 
    loginInfo.setPassword(sPassword); 
    sessionManager.setIdentity(sRepository, loginInfo); 

// THIS IS THE EVIL LINE ! 
    sessionManager.beginTransaction(); 

    System.out.println("sessionmanager ist geladen"); 
    IDfSession session = sessionManager.getSession(sRepository); 
    m_sUserName = sUserName; 
    m_sRepository = sRepository; 
    m_sessionManager = sessionManager; 

    return session; 
} 
+1

"beginTransaction"을 수행하는 회선 코드는별로 좋지 않지만 트랜잭션을 열면 "commitTransaction"을 사용하여 커밋해야합니다. 그러면 objectId가 확실히 데이터베이스에 유지됩니다. – Donatello

0

DFC로 폴더 생성을 시도 할 때 어떤 사용자를 사용하고 있습니까? DQL 검사를 위해 나중에 사용하는 것과 동일한 것입니까? 그렇지 않은 경우 폴더의 ACL로 인해 다른 사용자가 새로 만든 폴더를 볼 수 없습니다.

+0

슈퍼 유저 권한을 가진 사용자입니다. : \ –