Webアプリでは、エンティティを「ソフト削除」するためにHibernateの@SQLDelete
アノテーションを使用します(つまり、ステータス列を、実際にテーブルから削除するのではなく、「削除済み」ステータスを示す値に設定します)。
エンティティコードは次のようになります。
@Entity
@SQLDelete(sql="update pizza set status = 2 where id = ?")
public class Pizza { ... }
さて、私の問題は、Webアプリケーションが、テーブルが属するスキーマの所有者を使用してDBに接続しないことです。たとえば、スキーマ(Oracleの場合)はと呼ばれpizza
、Webアプリケーションが接続に使用するdbユーザーはですpizza_webapp
。これはセキュリティ上の理由によるものです。ユーザーにはpizza_webapp
選択/更新/削除権限のみがあり、DB自体の構造を変更することはできません。ここでは選択の余地はありません。変更できないポリシーです。
テーブルが実際に存在するスキーマの名前を、hibernate-default_schema
hibernateconfigのパラメーターで指定します。
<property name="hibernate.default_schema">pizza</property>
これは、マップされたエンティティを通過するすべてのものに対して正常に機能します。Hibernateは、生成するSQLのテーブル名の前にスキーマ名を追加する方法を知っています。ただし、生のSQLではなく、生のSQLが@SQLDelete
含まれています。これは「そのまま」実行され、結果として"table or view not found error"
。
これまでのところ、pizza_webapp
スキーマを指す同義語をスキーマに追加することで、この問題を回避しましたpizza
。それは機能しますが、エンティティが追加されたときに複数のDB間で維持するのは楽しいことではありません。
それで、パラメータを考慮に入れることは可能@SQLDelete
ですhibernate.default_schema
か?
(注:明らかに、SQLでもスキーマ名をハードコーディングしたくありません...)