我使用的是最新版本的PostgreSQL和postgresql-9.4.1208.jar(JDBC库)。
需要帮助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))]]
答案 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字段......