在 web 应用程序中,我使用 Hibernate 的@SQLDelete
注释来“软删除”实体(即将状态列设置为表示其“已删除”状态的值,而不是实际从表中删除它们)。
实体代码如下所示:
@Entity
@SQLDelete(sql="update pizza set status = 2 where id = ?")
public class Pizza { ... }
现在,我的问题是 Web 应用程序不使用表所属的模式的所有者连接到数据库。例如,模式(在 Oracle 中)被调用pizza
,而 webapp 用来连接的 db 用户是pizza_webapp
. 这是出于安全原因。pizza_webapp
用户只有选择/更新/删除权限,不能修改数据库本身的结构。我在这里别无选择,这是我无法改变的政策。
hibernate-default_schema
我使用hibernate config中的参数指定表实际所在的模式的名称:
<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 中硬编码模式名称......)