[解決済み] Hibernate4と@ElementCollectionにアップグレードすると、既存のデータを検索できなくなる。
2022-02-16 01:56:39
質問
モデルクラス
User
を持っていたのが
List<String>
のパーミッションで、こんな感じ。
@LazyCollection(LazyCollectionOption.FALSE)
@CollectionOfElements
@Column()
private List<String> permissions = Collections.emptyList();
以下のようなエントリーを持つSQLテーブルが生成されました。
最近、Hibernate 4にアップグレードしたのですが、その際に
@CollectionOfElements
アノテーションが非推奨から完全に削除されたので、これを機に
@ElementCollection
というように。
@LazyCollection(LazyCollectionOption.FALSE)
@ElementCollection // << CHANGED
@Column()
private List<String> permissions = Collections.emptyList();
しかし、起動すると、私たちが使っている 管理者 のアカウントでログインします。気になって、H2のJARを使ってデータベースを調べてみると、テーブルが変更されていることがわかりました。
私の質問です。
-
DDL/スキーマの変更点の包括的なリストはありますか?
@CollectionOfElements
から新しい@ElementCollection
? - 後方互換性を確保するために、推奨される方法、またはこれらのプロパティに提供できる追加アノテーションはありますか? (特定のネーム・マッピング・スキームやカラム名を指定できますか?)
-
最後に、私はすべての
Collection
の型はこの変更の影響を受けることになります。Sets
,Maps
などです。私はただ、アップグレードの際にデータを残したり、石を投げたりしないようにしたいだけなのです。
どのように解決するのですか?
最初の質問です。
私は知らない。しかし、JPAの仕様は自由に利用でき、デフォルトのテーブルとカラムの名前が何であるかが記述されています。
2つ目の質問です。
@ElementCollection
@CollectionTable(name = "USER_PERMISSIONS"
joinColumns = @JoinColumn(name = "USER_ID"))
@Column(name = "ELEMENT")
private List<String> permissions = Collections.emptyList();
個人的には、テーブル名とカラム名は必ず指定するようにしています。このような不意打ちを避けることができ、常に自分の好きな名前を選ぶことができ、自己文書化もできます。また、データベースのスキーマとDDLも自分で作成することを好んでいます。そうすることで、必要なインデックス、制約、コメントなどがすべて正しく作成されるからです。
3つ目の質問です。はい、コレクションの性質は問題ではありません。この種の問題を避けるには、2番目の質問の答えを参照してください。
関連
-
[解決済み】"比較メソッドはその一般契約に違反する!"
-
[解決済み】エラー「No enclosing instance of type Foo is accessible」の原因と修正方法について教えてください。
-
[解決済み】「error: '.class' expected」の意味と修正方法について
-
[解決済み】「java -cp」と「java -jar」の違い?
-
[解決済み】Java Error "Exception in thread "main" java.util.InputMismatchException" Array プログラムで発生。
-
[解決済み] [Solved] java.lang.NoClassDefFoundError: クラスXXXを初期化できませんでした。
-
[解決済み] StringBuilderをクリアまたは空にするにはどうすればよいですか?重複] [重複] [重複] [重複] [重複] [重複
-
[解決済み] java.sql.SQLException を取得しました。ResultSet が終了した後の操作は許可されません。
-
[解決済み] Spring Data JPAにおけるCrudRepositoryとJpaRepositoryのインターフェースの違いは何ですか?
-
[解決済み] OneToManyと@ElementCollectionの違い?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] if / for / while 内で "Missing return statement" が発生する。
-
[解決済み】エラー:配列または java.lang.Iterable のインスタンスに対してのみ反復処理を行うことができます。
-
[解決済み】imageio.IIOException: 入力ファイルが読み込めない
-
[解決済み】Android java.lang.IllegalStateException: Android java.lang.IllegalStateException: Could not execute method of the activity
-
[解決済み】ResultSetの例外 - 結果セットの開始前
-
[解決済み】keytoolエラー 鍵屋が改ざんされたか、パスワードが不正確だった場合
-
[解決済み】java 'jar'が内部コマンドまたは外部コマンドとして認識されない。
-
[解決済み】Hibernateの例外「failed to lazily initialize a collection of role」の解決方法
-
[解決済み】Eclipseで「JUnitテストが見つかりませんでした。
-
[解決済み】javaで無効な文字定数