是否有可能让@SQLDelete考虑hibernate.default_schema参数?

问题描述 投票:0回答:2

[在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中对模式名称进行硬编码...)

sql hibernate annotations
2个回答
0
投票

我无法找到任何Hibernate解决方案来解决此问题。但是,我发现了一种基于Oracle功能的解决方法。我在使用它之前在会话中进行此操作:


0
投票

是,有可能:

© www.soinside.com 2019 - 2024. All rights reserved.