EclipseLink & PostgreSQL не использует BIGSERIAL для Long id - PullRequest
0 голосов
/ 15 февраля 2012

Я ожидал, что приведенный ниже код создаст таблицу с идентификатором типа столбца BIGSERIAL.

@Entity
public class NewEntity1 implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
...

но он создал:

CREATE TABLE NEWENTITY1 (ID  SERIAL NOT NULL, PRIMARY KEY (ID))

я хочу сделать это БОЛЬШОЙ колонкой (не СЕРИЙНОЙ). как я могу это исправить?

мое окружение:

  • NetBeans7.1
  • GlassFish 3.1.1 (в комплекте NetBeans)
  • EclipseLink 2.3.0.v20110604-r9504 (в комплекте с NetBeans)
  • PostgreSQL 9.1.2 (драйвер JDBC: postgresql-9.0-801.jdbc4.jar)

спасибо.

Ответы [ 3 ]

1 голос
/ 11 февраля 2015

не используйте «Long» для определения типа идентификатора, но вместо этого «BigInteger».

0 голосов
/ 17 февраля 2012

Проблема здесь заключается в том, что EclipseLink PostgreSQLPlatform жестко кодирует строку, которую он использует в пределах printFieldIdentityClause, в значение «SERIAL». Это должно быть настраиваемо, поэтому, пожалуйста, отправьте сообщение об ошибке, чтобы оно изменилось.

Кроме использования columnDefinition, вы можете создать подкласс PostgreSQLPlatform и переопределить метод printFieldIdentityClause, чтобы распечатать то, что вам нужно. То есть:

@Override
    public void printFieldIdentityClause(Writer writer) throws ValidationException {
        try {
            writer.write(" SERIAL");
        } catch (IOException ioException) {
            throw ValidationException.fileError(ioException);
        }
    }

, а затем установите вместо свойств вашего модуля персистентности класс вашей платформы:

<property name="eclipselink.target-database" value="yourpackage.yourPlatformClass"/>
0 голосов
/ 15 февраля 2012

Используйте columnDefinition для указания на BIGSERIAL вместо типа отображения по умолчанию.

Пример:

@Entity
public class NewEntity1 implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(columnDefinition = "BIGSERIAL")
    private Long id;
...