繁体   English   中英

JPA单表层次结构中的PostgreSQL身份

[英]PostgreSQL identity in JPA single table hierarchy

在具有单个表继承层次结构的Hibernate / JPA环境中使用PostgreSQL时,我看到奇怪的行为。

首先我的环境:

  • PostgreSQL 8.3
  • 春季2.5.6SEC01
  • Hibernate-entitymanager 3.4.0.GA(从Glassfish更新工具安装)
  • Hibernate发行版3.3.1.GA(从Glassfish更新工具安装)
  • 玻璃鱼V2
  • Mac OS X 10.5.x

IDENTITYGenerationType与单个表继承层次结构一起使用时遇到问题。

这是我的两个实体:

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似乎认为此区分值是id。 所以下面的代码:

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

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

将id显示为123而不是主键值1。

如果我将生成类型更改为AUTO ,则将创建一个序列,并且插入似乎正常。 如果我将其更改为SEQUENCE并再次使用类级别的注释声明该序列,则它将起作用。 但是根据我已经阅读的文档,PostgreSQL支持两种生成类型。

我还尝试了完全相同的代码,并使用MySQL 5.0.51b切换了数据库。 这似乎工作正常。

那么这是我的代码,方言,休眠或PostgreSQL JDBC驱动程序中的错误吗? 有什么想法可以缩小问题范围吗? 当我尝试搜索并且还没有看到此确切问题时,任何能够重现此问题的人。

注意:我也在Hibernate论坛上提问了。 当然,我会反馈对这两个站点的任何答复。

我只是从上面的评论中“移植”此解决方案...使用8.3版的PostgreSQL JDBC驱动程序:-)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM