私はJPA2から始めて、今のところかなり快適に感じています。しかし、デフォルト値を持つNON NULLデータベースフィールドのnullプロパティ値を持つエンティティを永続化するときに問題があります。
エンティティプロパティをnullのままにして、データベースにデフォルト値を挿入させたいと思います。
私の現在のセットアップは、PostgreSQLでのopenJPAです。
この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構成によってデータベースフィールド(「ステータス」を除く)をマップするエンティティ(Java DTO)があります。
system_time
を設定せずにエンティティを挿入できることを期待し、データベースが現在の時刻をデフォルト値として入力することを期待していました。
JPAは次のSQL-Queryを構築します。
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」でのNot-Null-Constraint違反を意味します)。
じゃあどうすればいい?これはJPAまたはデータベースの問題ですか。 INSERT SQLステートメントからnullプロパティを除外するようにJPAを設定できますか?.
エンティティに「system_time」を設定する機能、または「null」にしてデータベースにデフォルト値を設定させる機能が必要です。
どんな助けでも大歓迎です!
レガズクラウス
JPAと組み合わせてデータベースのデフォルト値に依存しません。挿入後にエンティティを読み取る必要があります。そうしないと、エンティティの状態とデータベースの状態が一致しなくなります。
ここで実用的なアプローチを選択し、Javaですべての値を初期化します。 JPA/Hibernateに挿入/更新でnull値を除外するように指示する方法を聞いたことがありません。
注釈を使用する
@Column(insertable = false)
sqlで値が生成されないようにします。
注釈内 @カラム 敬意を表する 挿入可能 このようにfalseに:
`@Column(name =" system_time "、 挿入可能= false) `
または、値がNULLであるかどうかを確認する必要がある場合は、テーブルでトリガーBEFORE INSERTを実行します。
ドキュメントから:columnDefinition:列のDDLを生成するときに使用されるSQLフラグメント。
ColumnDefinitionを使用すると、必要に応じて制約を指定できます。
@Column(name="COLUMN_NAME",
columnDefinition="DATE DEFAULT CURRENT_DATE",table="TABLE_NAME")
そうでない場合は、エンティティ自体のフィールドを初期化してこれを取り除くことができます。
@Column(name = "somedate", nullable = false)
private Date someDate = new Date();
そのため、設定しない場合、デフォルトで現在の日付が挿入されます。
私は簡単な解決策を見つけました:pojoでデフォルト値を定義します。
@Column(name="system_time")
private Date systemTime = new Date();
Hibernate insert sql stmtでnullプロパティ値を除外するには、属性dynamic-insert = trueを使用します。
1. @ org.hibernate.annotations.Entity(dynamicInsert = true)これをクラスに追加します2.xmlマッピングで、クラスタグのdynamic-insert = true属性を使用します。
私はこれを(Oracleデータベースに対して)使用します。
@Temporal(TemporalType.TIMESTAMP)
@Column(name="CREATION_TIME",
columnDefinition="TIMESTAMP DEFAULT SYSTIMESTAMP",
nullable=false,
insertable=false,
updatable=false)
private Date creationTime;
@columnアノテーションにnullable = falseを追加することで、nullプロパティを回避できます。このような
@Column(name = "muColumn", nullable = false)