public void create(Dir dir) throws Exception {
    if (dir.getSVNVersionList() == null) {
      dir.setSVNVersionList(new ArrayList<SVNVersion>());
    }
    if (dir.getSVNFileList() == null) {
      dir.setSVNFileList(new ArrayList<SVNFile>());
    }
    EntityManager em = null;
    try {
      em = getEntityManager();

      SVNRepo SVNRepo = dir.getSVNRepo();
      if (SVNRepo != null) {
        SVNRepo = em.getReference(SVNRepo.getClass(), SVNRepo.getSvnid());
        dir.setSVNRepo(SVNRepo);
      }
      Revision revision = dir.getRevision();
      if (revision != null) {
        revision = em.getReference(revision.getClass(), revision.getRevisionID());
        dir.setRevision(revision);
      }
      List<SVNVersion> attachedSVNVersionList = new ArrayList<SVNVersion>();
      for (SVNVersion SVNVersionListSVNVersionToAttach : dir.getSVNVersionList()) {
        SVNVersionListSVNVersionToAttach =
            em.getReference(
                SVNVersionListSVNVersionToAttach.getClass(),
                SVNVersionListSVNVersionToAttach.getSVNVersionPK());
        attachedSVNVersionList.add(SVNVersionListSVNVersionToAttach);
      }
      dir.setSVNVersionList(attachedSVNVersionList);
      List<SVNFile> attachedSVNFileList = new ArrayList<SVNFile>();
      for (SVNFile SVNFileListSVNFileToAttach : dir.getSVNFileList()) {
        SVNFileListSVNFileToAttach =
            em.getReference(
                SVNFileListSVNFileToAttach.getClass(), SVNFileListSVNFileToAttach.getSVNFilePK());
        attachedSVNFileList.add(SVNFileListSVNFileToAttach);
      }
      dir.setSVNFileList(attachedSVNFileList);
      em.persist(dir);
      if (SVNRepo != null) {
        SVNRepo.getDirList().add(dir);
        SVNRepo = em.merge(SVNRepo);
      }
      if (revision != null) {
        revision.getDirList().add(dir);
        revision = em.merge(revision);
      }
      for (SVNVersion SVNVersionListSVNVersion : dir.getSVNVersionList()) {
        Dir oldDirOfSVNVersionListSVNVersion = SVNVersionListSVNVersion.getDir();
        SVNVersionListSVNVersion.setDir(dir);
        SVNVersionListSVNVersion = em.merge(SVNVersionListSVNVersion);
        if (oldDirOfSVNVersionListSVNVersion != null) {
          oldDirOfSVNVersionListSVNVersion.getSVNVersionList().remove(SVNVersionListSVNVersion);
          oldDirOfSVNVersionListSVNVersion = em.merge(oldDirOfSVNVersionListSVNVersion);
        }
      }
      for (SVNFile SVNFileListSVNFile : dir.getSVNFileList()) {
        Dir oldDirOfSVNFileListSVNFile = SVNFileListSVNFile.getDir();
        SVNFileListSVNFile.setDir(dir);
        SVNFileListSVNFile = em.merge(SVNFileListSVNFile);
        if (oldDirOfSVNFileListSVNFile != null) {
          oldDirOfSVNFileListSVNFile.getSVNFileList().remove(SVNFileListSVNFile);
          oldDirOfSVNFileListSVNFile = em.merge(oldDirOfSVNFileListSVNFile);
        }
      }
      // em.getTransaction().commit();
    } catch (Exception ex) {
      if (findDir(dir.getDirID()) != null) {
        throw new PreexistingEntityException("Dir " + dir + " already exists.", ex);
      }
      throw ex;
    } finally {
      if (em != null) {
        // em.close();
      }
    }
  }
 public void edit(Dir dir) throws IllegalOrphanException {
   EntityManager em = null;
   try {
     em = getEntityManager();
     // em.getTransaction().begin();
     Dir persistentDir = em.find(Dir.class, dir.getDirID());
     SVNRepo SVNRepoOld = persistentDir.getSVNRepo();
     SVNRepo SVNRepoNew = dir.getSVNRepo();
     Revision revisionOld = persistentDir.getRevision();
     Revision revisionNew = dir.getRevision();
     List<SVNVersion> SVNVersionListOld = persistentDir.getSVNVersionList();
     List<SVNVersion> SVNVersionListNew = dir.getSVNVersionList();
     List<SVNFile> SVNFileListOld = persistentDir.getSVNFileList();
     List<SVNFile> SVNFileListNew = dir.getSVNFileList();
     List<String> illegalOrphanMessages = null;
     for (SVNVersion SVNVersionListOldSVNVersion : SVNVersionListOld) {
       if (!SVNVersionListNew.contains(SVNVersionListOldSVNVersion)) {
         if (illegalOrphanMessages == null) {
           illegalOrphanMessages = new ArrayList<String>();
         }
         illegalOrphanMessages.add(
             "You must retain SVNVersion "
                 + SVNVersionListOldSVNVersion
                 + " since its dir field is not nullable.");
       }
     }
     for (SVNFile SVNFileListOldSVNFile : SVNFileListOld) {
       if (!SVNFileListNew.contains(SVNFileListOldSVNFile)) {
         if (illegalOrphanMessages == null) {
           illegalOrphanMessages = new ArrayList<String>();
         }
         illegalOrphanMessages.add(
             "You must retain SVNFile "
                 + SVNFileListOldSVNFile
                 + " since its dir field is not nullable.");
       }
     }
     if (illegalOrphanMessages != null) {
       throw new IllegalOrphanException(illegalOrphanMessages);
     }
     if (SVNRepoNew != null) {
       SVNRepoNew = em.getReference(SVNRepoNew.getClass(), SVNRepoNew.getSvnid());
       dir.setSVNRepo(SVNRepoNew);
     }
     if (revisionNew != null) {
       revisionNew = em.getReference(revisionNew.getClass(), revisionNew.getRevisionID());
       dir.setRevision(revisionNew);
     }
     List<SVNVersion> attachedSVNVersionListNew = new ArrayList<SVNVersion>();
     for (SVNVersion SVNVersionListNewSVNVersionToAttach : SVNVersionListNew) {
       SVNVersionListNewSVNVersionToAttach =
           em.getReference(
               SVNVersionListNewSVNVersionToAttach.getClass(),
               SVNVersionListNewSVNVersionToAttach.getSVNVersionPK());
       attachedSVNVersionListNew.add(SVNVersionListNewSVNVersionToAttach);
     }
     SVNVersionListNew = attachedSVNVersionListNew;
     dir.setSVNVersionList(SVNVersionListNew);
     List<SVNFile> attachedSVNFileListNew = new ArrayList<SVNFile>();
     for (SVNFile SVNFileListNewSVNFileToAttach : SVNFileListNew) {
       SVNFileListNewSVNFileToAttach =
           em.getReference(
               SVNFileListNewSVNFileToAttach.getClass(),
               SVNFileListNewSVNFileToAttach.getSVNFilePK());
       attachedSVNFileListNew.add(SVNFileListNewSVNFileToAttach);
     }
     SVNFileListNew = attachedSVNFileListNew;
     dir.setSVNFileList(SVNFileListNew);
     dir = em.merge(dir);
     if (SVNRepoOld != null && !SVNRepoOld.equals(SVNRepoNew)) {
       SVNRepoOld.getDirList().remove(dir);
       SVNRepoOld = em.merge(SVNRepoOld);
     }
     if (SVNRepoNew != null && !SVNRepoNew.equals(SVNRepoOld)) {
       SVNRepoNew.getDirList().add(dir);
       SVNRepoNew = em.merge(SVNRepoNew);
     }
     if (revisionOld != null && !revisionOld.equals(revisionNew)) {
       revisionOld.getDirList().remove(dir);
       revisionOld = em.merge(revisionOld);
     }
     if (revisionNew != null && !revisionNew.equals(revisionOld)) {
       revisionNew.getDirList().add(dir);
       revisionNew = em.merge(revisionNew);
     }
     for (SVNVersion SVNVersionListNewSVNVersion : SVNVersionListNew) {
       if (!SVNVersionListOld.contains(SVNVersionListNewSVNVersion)) {
         Dir oldDirOfSVNVersionListNewSVNVersion = SVNVersionListNewSVNVersion.getDir();
         SVNVersionListNewSVNVersion.setDir(dir);
         SVNVersionListNewSVNVersion = em.merge(SVNVersionListNewSVNVersion);
         if (oldDirOfSVNVersionListNewSVNVersion != null
             && !oldDirOfSVNVersionListNewSVNVersion.equals(dir)) {
           oldDirOfSVNVersionListNewSVNVersion
               .getSVNVersionList()
               .remove(SVNVersionListNewSVNVersion);
           oldDirOfSVNVersionListNewSVNVersion = em.merge(oldDirOfSVNVersionListNewSVNVersion);
         }
       }
     }
     for (SVNFile SVNFileListNewSVNFile : SVNFileListNew) {
       if (!SVNFileListOld.contains(SVNFileListNewSVNFile)) {
         Dir oldDirOfSVNFileListNewSVNFile = SVNFileListNewSVNFile.getDir();
         SVNFileListNewSVNFile.setDir(dir);
         SVNFileListNewSVNFile = em.merge(SVNFileListNewSVNFile);
         if (oldDirOfSVNFileListNewSVNFile != null && !oldDirOfSVNFileListNewSVNFile.equals(dir)) {
           oldDirOfSVNFileListNewSVNFile.getSVNFileList().remove(SVNFileListNewSVNFile);
           oldDirOfSVNFileListNewSVNFile = em.merge(oldDirOfSVNFileListNewSVNFile);
         }
       }
     }
     // em.getTransaction().commit();
     // } catch (Exception ex) {
     // String msg = ex.getLocalizedMessage();
     // if (msg == null || msg.length() == 0) {
     // Integer id = dir.getDirID();
     // if (findDir(id) == null) {
     // throw new NonexistentEntityException("The dir with id " + id + " no longer exists.");
     // }
     // }
     // throw ex;
   } finally {
     if (em != null) {
       // em.close();
     }
   }
 }