【问题标题】:JPA persist fails for GenerationType.IDENTITY对于 GenerationType.IDENTITY,JPA 持久化失败
【发布时间】:2012-04-27 18:00:30
【问题描述】:

我有一个在 JBOss 5、JPA 和 Derby 中运行良好的旧应用程序。我现在将它移植到 JBoss 6,却发现系统无法插入带有错误消息的实体:

列“ID”不能接受 NULL 值。

其中,ID 是一个标识列:

@Entity
public class Customer {
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    int id;
    ...
}

我检查了生成的架构,它看起来不错:

CREATE TABLE "APP"."CUSTOMER" (
    "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1), 
    "EMAIL" VARCHAR(255), 
    "NAME" VARCHAR(255),
    "PHONE" VARCHAR(255));

您可以在下面的链接中查看应用程序的代码。任何帮助表示赞赏。

https://docs.google.com/open?id=0B_lXBrNTL1s-R3NHb2hYZlJ1Znc

拉吉

【问题讨论】:

    标签: java jpa derby jboss6.x


    【解决方案1】:

    嗯,我有事情要做。基本上,当您使用 JPA 在 Derby 中生成模式时,它可以很好地创建表,但是在插入带有标识列的行时会出现问题。解决方案不是从 JPA 生成模式。我手动创建了架构并注释掉了架构生成选项。

    <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
    <persistence-unit name="ContactsPU" transaction-type="JTA">
        <jta-data-source>java:DerbyDS</jta-data-source>
        <class>com.webage.contacts.Customer</class>
        <!-- 
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
        </properties>
         -->
    </persistence-unit>
    </persistence>
    

    【讨论】:

      【解决方案2】:

      您无需自己创建方案即可解决此问题。 只需从 GenerationType.IDENTITY 更改为 GenerationType.TABLE。

      @GeneratedValue(strategy=GenerationType.TABLE)

      我在德比中遇到了同样的问题,这解决了它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-10-10
        • 2011-11-28
        • 1970-01-01
        • 2012-11-29
        • 1970-01-01
        • 2011-01-19
        • 2012-10-24
        相关资源
        最近更新 更多