Hibernate - nie działa autoincrement w Postgresql'u

0

Cześć,

Dotychczas używałem PHP'owego Doctrine, a teraz zacząłem uczyć się Hibernte.
Mam jednak problem, gdyż nowe wiersze, które są dodawane do tabeli mają identyfikator "0". Oczywiście nie wywołuję w Java'owej aplikacji metody setId().

Gdy sprawdzałem kod na bazie MySQL, wszystko było dobrze: kolejne rekordy miały odpowiednio ponumerowane wiersze.

Plik Email.hbm.xml wygląda tak:

<?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">
<!-- Generated 2013-11-11 07:49:22 by Hibernate Tools 3.6.0 -->
<hibernate-mapping>
    <class name="models.Email" table="email" schema="public">
        <id name="id" type="int">
            <column name="id" />
            <generator class="assigned" />
        </id>
        <many-to-one name="user" class="models.User" fetch="select">
            <column name="user_id" not-null="true" />
        </many-to-one>
        <property name="email" type="string">
            <column name="email" length="200" unique="true" />
        </property>
    </class>
</hibernate-mapping>

A dodawanie rekordu tak:

tx = session.beginTransaction();
Email email = new Email();
email.setEmail("aaaaaaaaaaa");
email.setUser(user2);
session.persist(email);
session.flush();
tx.commit();

Widzicie błąd?
Plik Email.hbm.xml wygenerowałem przez Netbeans'a

1

Spróbuj zmienić generator class na auto
dla postgresa użyj generatora typu sequence, a w bazie utwórz sekwencję, po wpisaniu w google haseł hibernate postgres sequence tutorial na pewno znajdziesz pełno dobrych wyników, no i widzę, że Rybaa w postach niżej pokazał jak to wygląda w przypadku adnotacji jpa

1

Nie uzywam Hibernate, ale EclipseLink, czyli konkurencyjnej implementacji JPA. Rowniez z polaczaniu z PostgreSQL.

W ogolnosci jesli chcesz miec autoincrement najprosciej uzyc typu serial i bigserial i wtedy JPA z auto generated classes to lapie.

W praktyce robie tak, ze dodaje sequence i informuje JPA o jego istnieniu mniej wiecej tak jak tu:

    @Id
    @GeneratedValue(generator = "role_seq", strategy = GenerationType.SEQUENCE)
    @SequenceGenerator(name = "role_seq", sequenceName = "role_id_seq", allocationSize = 1)
    @Basic(optional = false)
    @Column(name = "role_id")

serial to tez sequence, tylko ze niejawny

0

Ups ucielo mi jedna linijke:

    @Id
    @GeneratedValue(generator = "role_seq", strategy = GenerationType.SEQUENCE)
    @SequenceGenerator(name = "role_seq", sequenceName = "role_id_seq", allocationSize = 1)
    @Basic(optional = false)
    @Column(name = "role_id")
    private Integer roleId;

Gdyby nie sequence JPA nie wiedzialoby w jaki sposob ustawiac autoincrementy. "role_id_seq" zostal odczytany z PostgreSQL.

0

(W przykladzie, ktory przytoczylem typ klucza glownego to integer, nie serial).

1 użytkowników online, w tym zalogowanych: 0, gości: 1