/**
  * Explicitly adds the types to the entity.
  *
  * @return the entity with new composed types
  */
 public Object addDesignations(Object entity, URI... types) throws RepositoryException {
   if (entity instanceof RDFObjectBehaviour) {
     RDFObjectBehaviour support = (RDFObjectBehaviour) entity;
     Object delegate = support.getBehaviourDelegate();
     if (delegate != entity) {
       return addDesignations(delegate, types);
     }
   }
   assert types != null && types.length > 0;
   Resource resource = findResource(entity);
   Set<URI> list = new HashSet<URI>(4);
   getTypes(entity.getClass(), list);
   boolean autoCommit = isAutoCommit();
   if (autoCommit) {
     setAutoCommit(false);
   }
   try {
     for (URI type : types) {
       this.types.addTypeStatement(resource, type);
       list.add(type);
     }
     if (autoCommit) {
       setAutoCommit(true);
     }
   } finally {
     if (autoCommit && !isAutoCommit()) {
       rollback();
       setAutoCommit(true);
     }
   }
   return cache(of.createObject(resource, list));
 }
 /** Explicitly removes the types from the entity. */
 public void removeDesignations(Object entity, URI... types) throws RepositoryException {
   assert types != null && types.length > 0;
   boolean autoCommit = isAutoCommit();
   if (autoCommit) {
     setAutoCommit(false);
   }
   try {
     Resource resource = findResource(entity);
     for (URI type : types) {
       this.types.removeTypeStatement(resource, type);
     }
     if (autoCommit) {
       setAutoCommit(true);
     }
     cachedObjects.remove(resource);
   } finally {
     if (autoCommit && !isAutoCommit()) {
       rollback();
       setAutoCommit(true);
     }
   }
 }
 /** Imports the entity into the RDF store using the given handle. */
 public void addObject(Resource resource, Object entity) throws RepositoryException {
   if (entity instanceof RDFObjectBehaviour) {
     RDFObjectBehaviour support = (RDFObjectBehaviour) entity;
     Object delegate = support.getBehaviourDelegate();
     if (delegate != entity) {
       addObject(resource, delegate);
       return;
     }
   }
   synchronized (merged) {
     merged.add(resource);
   }
   boolean autoCommit = isAutoCommit();
   if (autoCommit) {
     setAutoCommit(false);
   }
   try {
     Class<?> proxy = entity.getClass();
     Set<URI> list = getTypes(proxy, new HashSet<URI>(4));
     for (URI type : list) {
       types.addTypeStatement(resource, type);
     }
     Object result = of.createObject(resource, list);
     if (result instanceof Mergeable) {
       ((Mergeable) result).merge(entity);
     }
     if (autoCommit) {
       setAutoCommit(true);
     }
     cachedObjects.remove(resource);
   } finally {
     if (autoCommit && !isAutoCommit()) {
       rollback();
       setAutoCommit(true);
     }
   }
 }