1. ホーム
  2. java

[解決済み] 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を使ってデータベースを調べてみると、テーブルが変更されていることがわかりました。

私の質問です。

  1. DDL/スキーマの変更点の包括的なリストはありますか? @CollectionOfElements から新しい @ElementCollection ?
  2. 後方互換性を確保するために、推奨される方法、またはこれらのプロパティに提供できる追加アノテーションはありますか? (特定のネーム・マッピング・スキームやカラム名を指定できますか?)
  3. 最後に、私はすべての 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番目の質問の答えを参照してください。