jiber hibernate пропустить вставить 'id' на вставке - PullRequest
2 голосов
/ 01 февраля 2012

Я разработал таблицу (в postgres), в которой столбец id автоматически инкремментируется через его сущность SEQUENCE. Но когда я начал использовать hibernate, я столкнулся с проблемой .... из-за создания оператора вставки он использовал оператор follow

INSERT INTO mytable (id, name) VALUE (0, 'blablabla')

...

но я хочу, чтобы это выглядело так:

INSERT INTO mytable (name) VALUE ('blablabla')

... Postgres должен автоматически генерировать id (по крайней мере, когда я запускал такие скрипты в редакторе sql, это работало)

Я верю, что это можно настроить, но я не знаю, как ...

Вот моя часть моего .hbm.xml:

<hibernate-mapping>
    <class name="com.cse.database.bean.Category" table="category">
        <id name="id" type="int">
            <column name="id" />
            <generator class="assigned" />
        </id>
        <property name="name" type="string">
            <column name="name" length="100" not-null="true" unique="true" />
        </property>
    </class>
</hibernate-mapping>

Ответы [ 2 ]

2 голосов
/ 01 февраля 2012

Когда вы указываете <generator>, вы говорите Hibernate, как создать идентификатор.assigned означает, что ваше приложение делает это (что вам не нужно).Вы можете указать класс Hibernate или даже класс приложения для этого, что вам тоже не нужно.identity означает, что база данных сделает это за вас, что вы и хотите.В некоторых базах данных вы можете использовать sequence (который запросит генератор последовательности для получения идентификатора, , а затем записать запись), а Hibernate позволяет вам использовать native, чтобы указать наиболее подходящий для вашей БД.

    <id name="id" type="int">
        <column name="id" />
        <generator class="identity" />
    </id>

, очевидно, работает в этом случае.

1 голос
/ 01 февраля 2012

assigned означает, что вы явно назначают идентификатор объекта, что не так.Проблема с этими автоматически сгенерированными идентификаторами в postgreSQL, AFAIK, заключается в том, что невозможно получить последний сгенерированный идентификатор, и что Hibernate не может получить идентификатор, назначенный объекту после его вставки.Вы не должны использовать автоматически сгенерированный идентификатор в PostgreSQL.

Вместо этого позвольте Hibernate использовать генератор последовательности и назначить идентификатор сущности перед ее вставкой:

@SequenceGenerator(name = "FOO_SEQ", sequenceName = "FOO_SEQ")
public class Foo {
    @Id
    @GeneratedValue(generator = "FOO_SEQ")
    @Column(name = "FOO_ID")
    private Long id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...