我正在开发一个 Spring 框架和 hibernate 应用程序,其中包含一个企业 Web 应用程序的中央数据库,该应用程序具有 每天约有 1000 位用户在线。
您可以假设有一个计费应用程序,任何人都可以在自己的帐户上执行任何操作(例如增加其计费金额或 减少他的账单金额)。
任何用户都有自己的数据,这些数据通过 hbm 文件中的过滤机制对特定用户进行保护:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping default-lazy="true">
<class name="org.myoffice.Inventory" table="Core_INVENTORY">
<id name="id" column="Id" type="java.lang.Long">
<generator class="sequence" >
<param name="sequence">SEQ_INVENTORY</param>
</generator>
</id>
<many-to-one name="bill" column="bill_ID" entity-name="org.myoffice.Bill" not-null="true" unique-key="unq_StrHouse_Smp_Pn_Exp"/>
<property name="expireDate" column="expire_Date" type="date" unique-key="unq_StrHouse_Smp_Pn_Exp"/>
<many-to-one name="user" column="user_id" entity-name="org.myoffice.User" not-null="true" update="false" />
<many-to-one name="createdBy" column="CreatedBy" entity-name="org.myoffice.User" not-null="true" update="false" />
<many-to-one name="updatedBy" column="UpdatedBy" entity-name="org.myoffice.User" not-null="true" />
<property name="createdDate" column="CreatedDate" type="date" not-null="true" update="false" />
<property name="updatedDate" column="UpdatedDate" type="date" not-null="true"/>
<property name="ip" column="IP" type="string" not-null="true"/>
<filter name="powerAuthorize" condition="[SQL QUERTY IS HERE FOR RESTRICTION ANY USER TO OWN DATA]"/>
</class>
</hibernate-mapping>
注意:上面 hbm 中的 ([SQL QUERTY IS HERE FOR RESTRICTION ANY USER TO OWN DATA]) 的结尾以 WHERE CLAUSE has userId 参数结束 用于限制用户只能使用自己的数据,并且此 userId 添加到通用存储库的以下方法中。
我将 hbm 的 powerAuthorize 添加到我的通用存储库中,如下所示:
public void applyDefaultAuthorizeFilter(Session session) {
Filter filter = session.enableFilter("powerAuthorize");
filter.setParameter("userId", SecurityUtility.getAuthenticatedUser().getId());
}
此过滤器始终添加到任何查询的末尾以过滤数据。
一切都工作正常,直到我的应用程序的使用者提出了与当前设计不兼容的新需求。消费者现在想要增加另一个用户的账单。
如果我跳过过滤器 hbm,任何用户都会看到另一个用户的信息,如果我不跳过过滤器,我将无法实现这个新请求。
是否有其他机制、模式或其他我可以使用的东西?
最佳答案
当条件不变但只有绑定(bind)参数值可能变化时,@Filter
非常有用。
这里您需要的是过滤 WHERE 子句谓词。因此,您需要将过滤逻辑移至数据访问层中。
- 您编写 DAO 方法来根据用户权限过滤 list 。
- 您删除了
@Filter
,因为 DAO 方法将会执行此操作。
从长远来看,这种设计也更加灵活。
关于java - Hibernate hbm 文件中的过滤机制对于动态谓词不是很灵活,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43716832/