Hibernate - Chave Composta

1 resposta
insuportavel

Fala pessoal, bom dia.

Estou enfrentando um problema com chaves composta em minha tabela. Tenho uma Tabela de Produtos onde a PK e composta por GRUPO, SUBGRUPO e EMBALAGEM.

Preciso ler um produto “X” qualquer.

Alguem tem ideia de como devo fazer?

Até agora consegui ir até o Banco de Dados:

public class HibernateSessionFactory {
	private static Logger logger = Logger.getLogger(HibernateSessionFactory.class);
	private static SessionFactory factory;
	static{
		Configuration configuration = new AnnotationConfiguration();
		configuration.configure();
		
		factory = configuration.buildSessionFactory();		
	}
	public static Session getSession(){
		logger.info("abrindo uma nova sessão");
		return factory.openSession();
	}
}

ir até minha tabela (eu fiz desta forma):

@Entity
@Table(name="eppro0a0")
public class ProdutoPrimario {
	@EmbeddedId
	private ProdutoComposto idDoProduto;

	public ProdutoComposto getIdDoProduto() {
		return idDoProduto;
	}

	public void setIdDoProduto(ProdutoComposto idDoProduto) {
		this.idDoProduto = idDoProduto;
	}

}

e

@SuppressWarnings("serial")
@Embeddable
class ProdutoComposto implements Serializable {
	   private Long grupo;
	   private Long subgrupo;
	   private Long embalagem;
	public Long getEmbalagem() {
		return embalagem;
	}
	public void setEmbalagem(Long embalagem) {
		this.embalagem = embalagem;
	}
	public Long getGrupo() {
		return grupo;
	}
	public void setGrupo(Long grupo) {
		this.grupo = grupo;
	}
	public Long getSubgrupo() {
		return subgrupo;
	}
	public void setSubgrupo(Long subgrupo) {
		this.subgrupo = subgrupo;
	}
}

e testar desta maneira…

public class TestaProdutoPrimarioDao {
	public static void main(String[] args) {
		Session session = HibernateSessionFactory.getSession();		
		Dao<ProdutoPrimario> produtoPrimarioDao = new Dao<ProdutoPrimario>(session, ProdutoPrimario.class);		
		ProdutoPrimario produtoPrimario = produtoPrimarioDao.load(10L);
		System.out.println(produtoPrimario.getIdDoProduto());
	}
}

só que o teste levanta esta exception:

10:35:28,951  WARN ConfigurationFactory:127 - No configuration found. Configuring ehcache from ehcache-failsafe.xml  found in the classpath: jar:file:/C:/Documents%20and%20Settings/marcelosalvador/workspace/dovac/web/WEB-INF/lib/ehcache-1.2.jar!/ehcache-failsafe.xml
10:35:30,543  INFO HibernateSessionFactory:20 - abrindo uma nova sessão
10:35:30,684  INFO Dao:27 - lendoclass br.com.dovac.modelo.ProdutoPrimario com id 10
Exception in thread "main" org.hibernate.PropertyAccessException: could not get a field value by reflection getter of br.com.dovac.modelo.ProdutoComposto.grupo
	at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:35)
	at org.hibernate.tuple.AbstractComponentTuplizer.getPropertyValue(AbstractComponentTuplizer.java:58)
	at org.hibernate.tuple.AbstractComponentTuplizer.getPropertyValues(AbstractComponentTuplizer.java:64)
	at org.hibernate.tuple.PojoComponentTuplizer.getPropertyValues(PojoComponentTuplizer.java:76)
	at org.hibernate.type.ComponentType.getPropertyValues(ComponentType.java:307)
	at org.hibernate.type.ComponentType.getHashCode(ComponentType.java:158)
	at org.hibernate.engine.EntityKey.generateHashCode(EntityKey.java:104)
	at org.hibernate.engine.EntityKey.<init>(EntityKey.java:48)
	at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:75)
	at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:871)
	at org.hibernate.impl.SessionImpl.load(SessionImpl.java:788)
	at org.hibernate.impl.SessionImpl.load(SessionImpl.java:781)
	at br.com.dovac.dao.Dao.load(Dao.java:28)
	at br.com.dovac.executavel.TestaProdutoPrimarioDao.main(TestaProdutoPrimarioDao.java:16)
Caused by: java.lang.IllegalArgumentException
	at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(Unknown Source)
	at sun.reflect.UnsafeObjectFieldAccessorImpl.get(Unknown Source)
	at java.lang.reflect.Field.get(Unknown Source)
	at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:32)
	... 13 more

Acredito que eu tenha errado ao escrever a classe de produtos.

Alguém pode me dar uma ajuda por favor?

1 Resposta

M

Então, eu não sei se é o melhor jeito, mas eu resolvi isso no meu programa colocando uma criteria a mais
algo assim:
crit.setFetchMode(“fluxo”, FetchMode.EAGER);

editado:

outra coisa que pode ser é o acesso direto a classe na criteria,

por exemplo eu tenho um objeto Funci dentro de uma classe demanda

esse funci tem um id mas se eu mandar uma criteria tipo

crit.add(Restrictions.eq(funci,Integer.parseInt(valor)));

ela  esse mesmo erro q vc falou eu fiz assim

crit.add(Restrictions.eq(funci.id,Integer.parseInt(valor)));
Criado 9 de novembro de 2006
Ultima resposta 14 de ago. de 2008
Respostas 1
Participantes 2