Início > Programação > Ligando Entidades Sem Associação Mapeada

Ligando Entidades Sem Associação Mapeada

É possível ligar duas entidades sem uma associação mapeada utilizando Criteria. Para mostrar como isso é possível, vou expandir o exemplo apresentado no stackoverflow. Considere as entidades Owner e Pet abaixo:

@Entity
@Table(name = "TBL_OWNER")
public class Owner {

	@Id
	@Column(name = "ID")
	private Long id;

	@Column(name = "NAME")
	private String name;

}
@Entity
@Table(name="TBL_PET")
public class Pet {
	
	@Id
	@Column(name = "ID")
	private Long id;
	
	@Column(name = "ID_OWNER")
	private Long idOwner;
	
	@Column(name = "NAME")
	private String name;
	
}

Embora teoricamente um Owner pudesse ter uma coleção de Pet, vamos supor que manter apenas uma referência ao ID do Owner tenha sido uma decisão consciente de design.

Para unir as duas entidades através do ID do Owner, vamos utilizar DetachedCriteria. De acordo com o manual do Hibernate, o DetachedCriteria permite criar uma query fora do escopo de uma sessão e depois executá-la utilizando uma sessão qualquer:

	public List<Owner> find() {
		Criteria criteria = session.createCriteria(Owner.class)
				.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

		DetachedCriteria petCriteria = DetachedCriteria.forClass(Pet.class);
		/*
		 * Projetamos a propriedade "idOwner" para que o resultado da subquery
		 * feita em Pet retorne uma colecao da propriedade e nao de Pet
		 */
		petCriteria.setProjection(Property.forName("idOwner"));
		petCriteria.add(Restrictions.eq("name", "Mad Dog"));
		criteria.add(Subqueries.propertyIn("id", petCriteria));

		return criteria.list();
	}

Note que o Criteria principal retornará uma coleção de Owner e o DetachedCriteria está relacionado à Pet, mas como projetamos o DetachedCriteria para ID do Owner em Pet, a subquery retornará uma coleção de IDs. Essa coleção é utilizada na cláusula IN do Criteria de Owner.

Anúncios
  1. Nenhum comentário ainda.
  1. No trackbacks yet.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: