Erro estranho JPA+Postgres(RESOLVIDO)

3 respostas
R

Olá galera,
Criei um projeto bem simples com o JPA pra fazer uns testes:
CREATE TABLE tb_pai
(
id integer NOT NULL,
nome character varying(255),
CONSTRAINT tb_pai_pkey PRIMARY KEY (id)
)

@Entity
@Table(name="tb_pai")
public class Pai {

	@SequenceGenerator( name = "pai_id", sequenceName = "seq_pai", allocationSize = 1 )  
	@GeneratedValue( strategy = GenerationType.AUTO, generator = "pai_id" )  
	@Id 
	@Column( name = "id", nullable = false )    
	private Integer id;  
	@Column
	private String nome;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public static void main(String[] args) {
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("pUnit");
		EntityManager em = emf.createEntityManager();
		em.getTransaction().begin();
		Pai p = new Pai();
		p.setNome("teste");
		em.persist(p);
		em.flush();
		em.getTransaction().commit();

	}
}

A cada vez que insiro um registro no banco,os demais registros são apagados.O que pode ser?

3 Respostas

Andr_Heidi_Moriya

Eae rafa4ever,

viu dexa pergunta uma coisa: vc ta usando o SchemaExport?

pois se estiver usando ele, tente usar o SchemaUpdate, alem dele.

tipo:

static { try { Configuration cfg = new AnnotationConfiguration(); cfg.configure("/jdbc/hibernate.cfg.xml"); factory = cfg.buildSessionFactory(); SchemaUpdate schema = new SchemaUpdate(cfg); // essa linha aki schema.execute(true, true); } catch (Throwable ex) { System.out.println("Initial SessionFactory creation failed.".concat(ex.getLocalizedMessage())); throw new ExceptionInInitializerError(ex); } }

Agora se vc ja estiver com a tabela criada no banco e fazendo apenas inserts. ai naum sei o que pode ser

outra coisa que eu percebi que vc faz ai, é a questao da coluna “ID”, vc faz o seguinte:

@SequenceGenerator( name = "pai_id", sequenceName = "seq_pai", allocationSize = 1 ) @GeneratedValue( strategy = GenerationType.AUTO, generator = "pai_id" ) @Id @Column( name = "id", nullable = false ) private Integer id;

vc usa o @SequenceGenerator para criar uma sequencia pelo que eu entendi.

vc ja tento fazer isso:

@Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(columnDefinition = "serial") private Integer id;

eu faço isso e ele já cria a sequencia no postgres.

Bem mas já que vc usa isso, é melhor assim?

Falow

dev.rafael

Se você está usando esse código para testar então eu imagino que o problema está no seu persistence.xml.

Veja, esse código só insere uma entidade no sua base a cada execução. Toda vez que você executa esse
código, na primeira criação de um EntityManager, o JPA carrega as configurações do arquivo persistence.xml
localizado no diretório META-INF do seu aplicativo. Esse arquivo contém as configurações do seu das suas
unidades de persistência. Dentre essas configurações está o a estratégia de criação/validação dos
relacionamentos. Essa propriedade vária de provider para provider, por exemplo, no hibernate essa
propriedade chama-se hibernate.hbm2ddl.auto. De acordo com o valor dessa propriedade o provider
pode criar as tabelas, dropar e recria-las ou simplesmente validar as tabelas com as suas entidades.
Provavelmente o seu problema está no valor dessa propriedade. Consulte a documentação do seu
provider, e o valor que está configurado nessa propriedade ou, na duvida, remova-a, típicamente
funciona.

R

Na mosca!
o persistence.xml tinha isso:

<property name="hibernate.hbm2ddl.auto" value="create-drop" />

Retirei e funcionou.
Muito obrigado!

Criado 1 de março de 2010
Ultima resposta 1 de mar. de 2010
Respostas 3
Participantes 3