Ciao a tutti,
In Eclipse sto muovendo i primissimi passi con Hibernate e PosgreSQL 8.4.
Ho scaricato il driver postgresql-8.4-702.jdbc4.jar che ho inserito in una cartella "lib" insieme a tutti gli altri JAR di Hibernate a cui faccio riferimento.
Ho creato poi una classe "Libro", semplicissima:
public class Libro {
private String titolo, autore;
private Long id;
public Libro() {
}
public Long getId() {
return id;
}
private void setId(Long id) {
this.id = id;
}
public String getTitolo() {
return titolo;
}
public void setTitolo(String titolo) {
this.titolo = titolo;
}
public String getAutore() {
return autore;
}
public void setAutore(String autore) {
this.autore = autore;
}
}
a cui corrisponde una tabella Postgres chiamata "libri" all'interno del database "mydb" e così definita:
CREATE TABLE libri
(
id serial NOT NULL,
titolo text,
autore text,
CONSTRAINT pkey1 PRIMARY KEY (id)
)
WITH (
OIDS=FALSE
);
ALTER TABLE libri OWNER TO marco;
Ho poi creato il file Libro.hbm.xml:
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Libro" table="libri">
<id name="id" column="id">
<generator class="native"/>
</id>
<property name="titolo"/>
<property name="autore"/>
</class>
</hibernate-mapping>
ed il file Hibernate.cfg.xml:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">org.postgresql.Driv er</property>
<property name="connection.url">jdbcostgresql://localhost/mydb</property>
<property name="connection.username">marco</property>
<property name="connection.password">miapassword</property>
<property name="connection.pool_size">1</property>
<property name="current_session_context_class">thread</property>
<property name="dialect">org.hibernate.dialect.PostgreSQLDia lect</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">create</property>
<mapping resource="Libro.hbm.xml"/>
</session-factory>
</hibernate-configuration>
infine ho scritto la classe per testare il salvataggio in tabella di un nuovo libro:
import org.hibernate.*;
import org.hibernate.cfg.*;
public class HibernateExample {
public HibernateExample() {
}
public static void main(String a[]) {
Session session = null;
try{
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
session = sessionFactory.openSession();
session.beginTransaction();
Libro libro = new Libro();
libro.setTitolo("Bel titolo");
libro.setAutore("Marco");
session.persist(libro);
}catch(Exception e){
System.out.println(e.getMessage());
}finally{
session.getTransaction().commit();
session.close();
}
}
}
Ora succede che questo codice non si limita a creare un nuovo libro in tabella, ma cancella tutti quelli eventualmente già presenti.
Inoltre andando a rivedere la definizione della tabella, la trovo alterata:
CREATE TABLE libri
(
id bigint NOT NULL,
titolo character varying(255),
autore character varying(255),
CONSTRAINT libri_pkey PRIMARY KEY (id)
)
WITH (
OIDS=FALSE
);
ALTER TABLE libri OWNER TO marco;
l'id che avevo definito come 'serial' è diventato un bigint. Titolo e autore erano di tipo 'text' e ora sono character varying(255).
Trovo anche una sequenza nuova, evidentamente creata da Hibernate, così definita:
CREATE SEQUENCE hibernate_sequence
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1;
ALTER TABLE hibernate_sequence OWNER TO marco;
Mi aiutate a capire cosa sto sbagliando?
Grazie,
Marco