[在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
用户仅具有选择/更新/删除权限,不能修改数据库本身的结构。我在这里别无选择,这是我无法更改的政策。
我在hibernate config中使用hibernate-default_schema
参数指定表实际所在的模式的名称:
<property name="hibernate.default_schema">pizza</property>
这对于通过映射的实体进行的所有操作都很好,Hibernate知道如何在其生成的SQL中将模式名称添加到表名称的前面。但不适用于原始SQL,@SQLDelete
包含原始SQL。这是“按原样”执行的,并导致"table or view not found error"
。
到目前为止,我们通过在pizza_webapp
模式中添加同义词,指向pizza
模式来解决该问题。它可以工作,但是在添加实体时跨多个数据库进行维护并不是一件有趣的事情。
因此,可以使@SQLDelete
考虑到hibernate.default_schema
参数吗?
((注意:显然我也不想在SQL中对模式名称进行硬编码...)
我无法找到任何Hibernate解决方案来解决此问题。但是,我发现了一种基于Oracle功能的解决方法。我在使用它之前在会话中进行此操作:
是,有可能: