EclipseLink JPA在INSERT语句中重新排序列名并导致异常

时间:2016-05-06 01:47:07

标签: jpa insert eclipselink

我使用的是最新版本的PostgreSQL和postgresql-9.4.1208.jar(JDBC库)。

  • 使用glassfish 4.1
  • EclipseLink Eclipse持久性服务 - 2.6.2.v20151217-774c696

需要帮助FORCE在JPA自动生成的INSERT SQL中列出列名的顺序。

INSERT SQL(由entityMgr.persist(...)自动创建); 注意:列的排序是如此古怪,但是这些值与我在java源代码中的完全一样(我甚至在列中加上“order#”来跟踪)。

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.2.v20151217-774c696): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException:
ERROR: column "c08_cancel_dt" is of type timestamp with time zone but expression is of type character varying
    Hint: You will need to rewrite or cast the expression.
    Position: 211
    Error Code: 0
    Call: INSERT INTO apns_new_request (c01_seqnum, c03_app_on_device,
    c08_cancel_dt, c02_device_id, c07_due_dt, c05_item_id,
    c11_item_title, c10_modified, c09_received, c06_request_state,
    c04_event_src)
    VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
        bind => [11 parameters bound]
    Query: InsertObjectQuery(
    afjkalkhawifualjfklsdjkczsd,        <<-- c02_
    iOS-Calendar-zzzzzzzzzzzzzzzzzz,    <<-- c03_
    LaptopBrowser,                      <<-- c04_
    123000123,                          <<-- c05_
    1,2016-05-06T20:51:44.662-04:00,    <<-- c06_
    null,                               <<-- c07_
    2016-05-05T20:51:44.662-04:00,      <<-- c08_
    2016-05-05T20:51:44.662-04:00,      <<-- c09_
    Hi-OffsetDateTime-1!)               <<-- c10_

不是问题,但请注意下面的同一个古怪的顺序,在TABLE-CREATE期间,以强制排序为前缀的列名如何失败......在部署期间(persistence.xml有'drop-and-create-tables' )

 org.eclipse.persistence.session./file:/opt/glassfish4/glassfish/domains/domain1/applications/iOS_RemoteNotif/WEB-INF/classes/_APNSPersistenceUnit.sql] [tid: _ThreadID=46 _ThreadName=admin-listener(5)] [timeMillis: 1462495579354] [levelValue: 500] [[
    CREATE TABLE apns_new_request (c01_seqnum  BIGINT NOT NULL , c03_app_on_device  CHAR(32) NOT NULL ,
    c08_cancel_dt  TIMESTAMP WITH TIME ZONE NULL , c02_device_id  VARCHAR(128) NOT NULL ,
    c07_due_dt  TIMESTAMP WITH TIME ZONE NOT NULL , c05_item_id  CHAR(32) NOT NULL ,
    c11_item_title  VARCHAR(64) NOT NULL , c10_modified  TIMESTAMP WITH TIME ZONE NOT NULL ,
    c09_received  TIMESTAMP WITH TIME ZONE NOT NULL , c06_request_state  SMALLINT NOT NULL ,
    c04_event_src  CHAR(64) NOT NULL , PRIMARY KEY (c01_seqnum))]]

2 个答案:

答案 0 :(得分:1)

InsertObjectQuery只是在它插入的对象上调用toString,而不显示绑定到该语句的参数。参数将显示在&#34; [11参数绑定]&#34;如果已启用参数binding

,则为日志

显示c08_cancel_dt字段的映射,以查看它可能存在问题的原因,以及查询中使用的参数。

答案 1 :(得分:0)

EclipseLink Bug(受自定义@annotations影响时 - 导致自动生成的INSERT SQL的列定位不匹配)

Eclipse Persistence Services - 2.6.2.v20151217-774c696

非常简单的证据。

我将所有java.time.OffsetDateTime替换为java.util.Date - 用于实体Bean中的所有日期字段。 我从那个bean中删除了我的@CustomBeanValidator注释。

然后我删除了(我自己的)自定义Bean-Validator java文件(MyOffsetDateTimeValidator&amp; OffsetDateTimeValidator), 以及Custom JPA-field-converter java类(JPAOffsetDateConverter)。

请参阅My other post that contains the code for these two java classes

mvn clean package deploy ....

现在JPA就像魅力一样 - 在GlassFish日志中没有错误也没有警告。 数据完美地存储在PostgreSQL表中的相应列中!

P.S:不幸的是,我在数据库中仍然没有时区数据,因此必须使用变通办法/附加的实体bean字段......