避免向數據庫表中插入'null'值,從JPA2開始,到目前爲止感覺非常舒適。但是,對於具有默認值的NON NULL數據庫字段,使用空屬性值持久化實體時遇到問題。通過JPA
我想能夠離開實體屬性爲空,並讓數據庫插入默認值。
我目前的設置是openJPA和PostgreSQL。
我有此VERSION數據庫表(Vorgabewert =默認值):
Spalte | Typ | Attribute
----------------+-----------------------------+----------------------------
status_ | smallint | not null Vorgabewert 0
time_ | timestamp without time zone | not null
system_time | timestamp without time zone | not null Vorgabewert now()
version | character varying(20) | not null
activationtime | timestamp without time zone |
importtime | timestamp without time zone |
我具有由XML配置的實體(爪哇DTO),其映射數據庫字段(除了 '狀態')。
我希望我可以插入一個沒有system_time
集的實體,並且期望數據庫將當前時間填充爲默認值。
JPA構造下面的SQL查詢:
INSERT INTO public.version (version, activationtime, importtime, system_time, time_) VALUES (?, ?, ?, ?, ?) [params=?, ?, ?, ?, ?]
和Postgres與反應:
FEHLER: NULL-Wert in Spalte »system_time« verletzt Not-Null-Constraint
(對不起,德語,但這個消息意味着非空約束違反了「SYSTEM_TIME」) 。
那麼我該怎麼辦?這是一個JPA或數據庫問題。 我可以將JPA配置爲從INSERT SQL語句中排除空屬性嗎?
我希望能夠在我的實體中設置'system_time'或讓它爲'null',並讓數據庫將默認值設置爲'null'。
歡迎任何幫助!
Regads 克勞斯
由JPA EntityManager的持續的實體(javax.persistence.EntityManager.persist(對象))時產生的INSERT statment。如何將JPA配置爲在空列時省略該列? – FrVaBe 2010-12-22 12:03:02
不確定JPA,但Hibernate支持註釋「dynamicInsert = true,dynamicUpdate = true」,它不會發送任何未更改的行。 – 2010-12-22 13:04:49
Hibernate還在屬性映射上支持「insert ='false'」和「update ='false'」,以省略生成的靜態插入/更新SQL中的某些列。映射「insert ='false'generated ='insert'」在這裏可能是合適的(不知道如何將其轉換爲註釋配置)。 – araqnid 2010-12-23 11:11:05