Tabela sem PK

Pessoal , boa tarde.

Estou aprendendo java e junto o Hibernate tbm, então meu conhecimento é muito limitado.

Oq acontece é o seguinte :

Estou tentando mapear uma tabela sem PK usando o Hibernate Tools para a tabela abaixo

QTD                             INTEGER Nullable
NOME                            VARCHAR(10) Nullable
SOBRENOME                       VARCHAR(10) Nullable
VALORUN                         FLOAT Nullable
VALORTOT                        FLOAT Nullable

Usando o Hibernate Tools foi gerado os seguintes códigos: Venda.java e VendaId.java

Venda.java

/**
 * Venda generated by hbm2java
 */
@Entity
@Table(name = "VENDA")
public class Venda implements java.io.Serializable {

	private VendaId id;

	public Venda() {
	}

	public Venda(VendaId id) {
		this.id = id;
	}

	@EmbeddedId
	@AttributeOverrides( {
			@AttributeOverride(name = "qtd", column = @Column(name = "QTD")),
			@AttributeOverride(name = "nome", column = @Column(name = "NOME", length = 10)),
			@AttributeOverride(name = "sobrenome", column = @Column(name = "SOBRENOME", length = 10)),
			@AttributeOverride(name = "valorun", column = @Column(name = "VALORUN", precision = 7, scale = 7)),
			@AttributeOverride(name = "valortot", column = @Column(name = "VALORTOT", precision = 7, scale = 7)) })
	public VendaId getId() {
		return this.id;
	}

	public void setId(VendaId id) {
		this.id = id;
	}

}

VenaId.java

// Generated 13/11/2009 16:10:51 by Hibernate Tools 3.2.4.GA

import javax.persistence.Column;
import javax.persistence.Embeddable;

/**
 * VendaId generated by hbm2java
 */
@Embeddable
public class VendaId implements java.io.Serializable {

	private Integer qtd;
	private String nome;
	private String sobrenome;
	private Double valorun;
	private Double valortot;

	public VendaId() {
	}

	public VendaId(Integer qtd, String nome, String sobrenome, Double valorun,
			Double valortot) {
		this.qtd = qtd;
		this.nome = nome;
		this.sobrenome = sobrenome;
		this.valorun = valorun;
		this.valortot = valortot;
	}

	@Column(name = "QTD")
	public Integer getQtd() {
		return this.qtd;
	}

	public void setQtd(Integer qtd) {
		this.qtd = qtd;
	}

	@Column(name = "NOME", length = 10)
	public String getNome() {
		return this.nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	@Column(name = "SOBRENOME", length = 10)
	public String getSobrenome() {
		return this.sobrenome;
	}

	public void setSobrenome(String sobrenome) {
		this.sobrenome = sobrenome;
	}

	@Column(name = "VALORUN", precision = 7, scale = 7)
	public Double getValorun() {
		return this.valorun;
	}

	public void setValorun(Double valorun) {
		this.valorun = valorun;
	}

	@Column(name = "VALORTOT", precision = 7, scale = 7)
	public Double getValortot() {
		return this.valortot;
	}

	public void setValortot(Double valortot) {
		this.valortot = valortot;
	}

	public boolean equals(Object other) {
		if ((this == other))
			return true;
		if ((other == null))
			return false;
		if (!(other instanceof VendaId))
			return false;
		VendaId castOther = (VendaId) other;

		return ((this.getQtd() == castOther.getQtd()) || (this.getQtd() != null
				&& castOther.getQtd() != null && this.getQtd().equals(
				castOther.getQtd())))
				&& ((this.getNome() == castOther.getNome()) || (this.getNome() != null
						&& castOther.getNome() != null && this.getNome()
						.equals(castOther.getNome())))
				&& ((this.getSobrenome() == castOther.getSobrenome()) || (this
						.getSobrenome() != null
						&& castOther.getSobrenome() != null && this
						.getSobrenome().equals(castOther.getSobrenome())))
				&& ((this.getValorun() == castOther.getValorun()) || (this
						.getValorun() != null
						&& castOther.getValorun() != null && this.getValorun()
						.equals(castOther.getValorun())))
				&& ((this.getValortot() == castOther.getValortot()) || (this
						.getValortot() != null
						&& castOther.getValortot() != null && this
						.getValortot().equals(castOther.getValortot())));
	}

	public int hashCode() {
		int result = 17;

		result = 37 * result
				+ (getQtd() == null ? 0 : this.getQtd().hashCode());
		result = 37 * result
				+ (getNome() == null ? 0 : this.getNome().hashCode());
		result = 37 * result
				+ (getSobrenome() == null ? 0 : this.getSobrenome().hashCode());
		result = 37 * result
				+ (getValorun() == null ? 0 : this.getValorun().hashCode());
		result = 37 * result
				+ (getValortot() == null ? 0 : this.getValortot().hashCode());
		return result;
	}

}

Criei tabem uma DAO genérica (HibernateDAO.java) e um sessionfactory (HibernateUtil.java), conforme os códigos

HibernateDAO.java

import java.io.Serializable;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.MatchMode;

public class HibernateDAO<T> implements InterfaceDAO<T> {

	private Class<T> classe;
	private Session session;
	
	public HibernateDAO(Class<T> classe, Session session) {
		super();
		this.classe = classe;
		this.session = session;
	}

	@Override
	public void atualizar(T bean) {
		session.update(bean);
	}

	@Override
	public void excluir(T bean) {
		session.delete(bean);
	}

	@Override
	public T getBean(Serializable codigo) {
		T bean = (T)session.get(classe, codigo);
		return bean;
	}

	@Override
	public List<T> getBeans() {
		List<T> beans = (List<T>)session.createCriteria(classe).list();
		return beans;
	}

	@Override
	public void salvar(T bean) {
		session.save(bean);
	}

	@Override
	public List<T> getBeansByExample(T bean) {
		Example example = Example.create(bean);
		example.enableLike(MatchMode.START);
		example.ignoreCase();
		example.excludeZeroes();
		return session.createCriteria(classe).add(example).list();
	}


}

HibernateUtil.java

import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;



public class HibernateUtil {
	private static SessionFactory sessionFactory;	 
	static
	{
		AnnotationConfiguration configuration = new AnnotationConfiguration().configure("hibernate.cfg.xml");
		sessionFactory = configuration.buildSessionFactory();
	}

	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}
}

E para testar criei uma servelet com o trecho do código abaixo

teste.java

		Session session;		
		session = HibernateUtil.getSessionFactory().openSession();

		HibernateDAO<Venda> T2 = new HibernateDAO<Venda>(Venda.class,session);		

		List<Venda> listaT2 = T2.getBeans();		

		for(Venda lst: listaT2){
			System.out.println(lst.getId().getNome());
		}

Oque acontece é o seguinte : recebo a exceptio “java.lang.NullPointerException” , o método getId do Venda.java está retornando nulo , mas pq isso ? no console eu consigo ver que o Hibernate gerou o sql, mas não consigo recuperar os dados.

Obrigado a todos

[]s

Nao colocar chave primaria na tabela é uma coisa q vc provavelmente não usará, isso só vai complicar seus estudos :slight_smile:
Você tem certeza que quer saber o objetivo desse codigo aí? rsrrs

[[]]ss

caso positivo eu volto aki e ajudo a explicar … mas pense bem se isso vai realmente te adicionar conhecimento ou se vai te complicar os estudos desnecessariamente :slight_smile:

valeu

Opa …td bem , então, na verdade eu estou aprendendo e tentando migrar uma aplicação onde eu trabalho.

Sei da importância de usar PK e FK e sei que esta é a forma correta. Porém o sistema em que estou trabalhando já veio migrado
de uma base chamada DBISAM onde quem a fez não utilizou nenhuma FK e tem várias tabelas sem PK … Atualmente o sistema é composto por 2 partes um “monitor” que captura dados e controla um hardware especifico feito em Delphi e por fim um módulo cliente (feito em Delphi tbm) que gera relatórios e algumas configurações.

Nossa idéia é desenvolver este cliente para rodar em jee e como estou aprendendo essas tecnologias agora achei uma boa idéia ir “construindo” o sistema em paralelo, pelo menos p/ a primeira “aversão” rs…

Só para dar mais informações , estava fuçando no código e vi q no arquivo teste.java

a instância retornado pelo meu metodo “T2.getBeans()” está retornando uma lista de 12 elementos nulos , a mesma qtd
de registros na tabela.

antes imaginava que o método getId estava retornando nulo mas agora vi que quem está fazendo isso é o getBeans ( que está implementado em HibernateDAO.java)

Mas o pq disso ?

Obrigado.

[]s