/**
* Finds an entity by its identifier.
*
* @param $id The identifier.
* @param int $lockMode
* @param int $lockVersion
* @return object The entity.
*/
public function find($id, $lockMode = LockMode::NONE, $lockVersion = null)
{
// Check identity map first
if ($entity = $this->xem->getUnitOfWork()->tryGetById($id, $this->class->rootXmlEntityName)) {
if ($lockMode != LockMode::NONE) {
$this->xem->lock($entity, $lockMode, $lockVersion);
}
return $entity;
// Hit!
}
if ($lockMode == LockMode::NONE) {
return $this->xem->getUnitOfWork()->getXmlEntityPersister($this->entityName)->load($id);
} else {
if ($lockMode == LockMode::OPTIMISTIC) {
if (!$this->class->isVersioned) {
throw OptimisticLockException::notVersioned($this->entityName);
}
$entity = $this->xem->getUnitOfWork()->getEntityPersister($this->entityName)->load($id);
$this->xem->getUnitOfWork()->lock($entity, $lockMode, $lockVersion);
return $entity;
} else {
if (!$this->xem->getConnection()->isTransactionActive()) {
throw TransactionRequiredException::transactionRequired();
}
return $this->xem->getUnitOfWork()->getXmlEntityPersister($this->entityName)->load($id, null, null, array(), $lockMode);
}
}
}