Идентификация PostgreSQL в иерархии отдельных таблиц JPA - PullRequest
2 голосов
/ 26 августа 2009

Я вижу странное поведение при использовании PostgreSQL в среде Hibernate / JPA с иерархией наследования одной таблицы.

Во-первых, мое окружение:

  • PostgreSQL 8,3
  • Пружина 2.5.6SEC01
  • Hibernate-entitymanager 3.4.0.GA (устанавливается из инструмента обновления Glassfish)
  • Hibernate-дистрибутив 3.3.1.GA (устанавливается из средства обновления Glassfish)
  • Glassfish V2
  • Mac OS X 10.5.x

У меня проблема при использовании GenerationType из IDENTITY с иерархией наследования одной таблицы.

Вот мои две сущности:

Parent.java

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="generation", discriminatorType=DiscriminatorType.STRING)
@DiscriminatorValue("Parent")
public class Parent implements Serializable {
    private static final long serialVersionUID = 1L;

    private Long id;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
}

Child.java

@Entity
@DiscriminatorValue("Child")
public class Child extends Parent {
    private String babyName;

    /**
     * @return the babyName
     */
    public String getBabyName() {
        return babyName;
    }

    /**
     * @param babyName the babyName to set
     */
    public void setBabyName(String babyName) {
        this.babyName = babyName;
    }
}

DDL

create table Parent (generation varchar(31) not null
                    ,id  bigserial not null
                    ,babyName varchar(255)
                    ,primary key (id)
                    );

Если я пытаюсь вставить нового родителя, я получаю сообщение об ошибке:

org.postgresql.util.PSQLException: Bad value for type long : Parent

Я включил запись в TRACE, и это вывод:

TRACE TransactionSynchronizationManager - Bound value [org.springframework.orm.jpa.EntityManagerHolder@485e0366] for key [com.sun.enterprise.util.EntityManagerFactoryWrapper@a6e312b] to thread [httpSSLWorkerThread-8080-0]
Hibernate: insert into Parent (generation) values ('Parent')
SQL Error: 0, SQLState: 22003
Bad value for type long : Parent
TRACE TransactionInterceptor - Completing transaction for [com.xxx.yyy.service.MoveService.saveHuman] after exception: javax.persistence.PersistenceException: org.hibernate.exception.DataException: could not insert: [com.xxx.yyy.temp.Parent]
TRACE RuleBasedTransactionAttribute - Applying rules to determine whether transaction should rollback on javax.persistence.PersistenceException: org.hibernate.exception.DataException: could not insert: [com.xxx.yyy.temp.Parent]

Если я изменю значение дискриминатора на то, что анализируется как длинный, например 123 вставка выполнена успешно. Однако Hibernate, кажется, считает, что это значение дискриминатора является идентификатором. Итак, следующий код:

Parent p = new Parent();
service.saveHuman(p);

add(new Label("p", "p id is" + p.getId())); 

Показывает идентификатор как 123, а не значение первичного ключа, равное 1.

Если я изменю тип генерации на AUTO, создается единственная последовательность, и вставка работает нормально. Если я изменю его на SEQUENCE и снова объявлю последовательность с аннотацией на уровне класса, это сработает. Однако согласно документации, которую я прочитал, PostgreSQL поддерживает оба типа генерации.

Я также попробовал точно такой же код и переключил базу данных с MySQL 5.0.51b. Кажется, это нормально работает.

Так это ошибка в моем коде, диалекте, Hibernate или драйвере PostgreSQL JDBC? Любые идеи, как я могу сузить проблему? Любой, кто сможет воспроизвести эту проблему, как я пытался найти, и еще не видел этой проблемы.

Примечание: Я также задавал вопрос на форумах Hibernate . Естественно, я буду отзываться на любые ответы на оба сайта.

1 Ответ

1 голос
/ 28 августа 2009

Я просто "портирую" это решение из комментариев выше ... используйте версию 8.3 драйвера JDBC PostgreSQL: -).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...