是否可以从Hibernate(5)中检索实体之间的关系是如何配置的?
我的用例如下:我有一个Web服务,它提供(读取)对关系数据库中数据的访问。数据由多个实体组成,其中一些通过外键(通常的一对一,一对多,多对一,多对多)相关联。在请求数据时,客户端可以指定过滤器,并且在过滤器中,它们可以自由地遍历实体关系。有些事情需要将过滤器转换为Hibernate理解的东西。目前,我们正在生成Criteria
。
例如,假设我们有2个实体A
和B
,其中属性A.bees
引用B
的集合。这是通过在B
中引用A
的主键的外键列来在Hibernate中映射的。然后,用户可以从A
开始请求所有B
至少有一个B.name
'Bla'
A
。该请求指定我们正在查找<like>
<property>bees.name</property>
<literal>Bla*</literal>
</like>
类型的结果,其过滤器部分类似于:
AssociationType
问题是:我的服务不控制Hibernate映射,因此不知道如何配置关系,甚至不知道存在哪些实体。它只是加载映射,转换并应用过滤器并吐出Hibernate返回的任何数据。我不能按照规范(实际上是OGC过滤器)更改请求内容。
到目前为止,我能够找到正确的实体并遵循属性路径,在此过程中遇到属性EntityMetadata
和Criterion
并将所有过滤元素转换为单独的B
s 。我无法做的是找到实体是如何相关的:在示例中,&#34; A
具有引用<faces-config version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd">
<application>
<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
的主键的外键的事实&# 34 ;.谁能告诉我如何获取这些信息?
答案 0 :(得分:0)
我不确定我是否完全理解您的数据库访问权限,但如果您可以连接到数据库,则可以使用JDBC的DatabaseMetaData类及其导出的密钥方法: https://docs.oracle.com/javase/7/docs/api/java/sql/DatabaseMetaData.html#getExportedKeys(java.lang.String,%20java.lang.String,%20java.lang.String)
答案 1 :(得分:0)
原来我误解了在Hibernate中应该怎么做。我正在使用Criteria API生成我自己编写的查询:
session.createCriteria("A")
.add(Property.forName("id").in(
DetachedCriteria.forEntityName("B")
.add(Restrictions.like("name", "Bla%"))
.setProjection(Projections.property("fk_a"))))
结果查询(几乎)
SELECT a.*
FROM A a
WHERE a.id IN (SELECT b.fk_a
FROM B b
WHERE b.name LIKE 'Bla%')
问题是我不知道名字id
和fk_a
。
我应该做的事情(现在正在做)就是让Hibernate做连接。
session.createCriteria("A")
.createAlias("B", "b")
.add(Restrictions.like("b.name", "Bla%"))
.setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE)
由此产生的查询(几乎)
SELECT a.*, b.*
FROM A a INNER JOIN B b ON a.id = b.fk_a
WHERE b.name LIKE 'Bla%')
现在我不需要知道主键和外键属性的名称。
这种方法的明显缺点是,当返回A和相关B的笛卡尔积时,更多数据从服务器传输到客户端。我们通过表明我们只对不同的根实体感兴趣来得到预期的答案。变压器虽然在客户端运行,但它确实无助于减少流量。