从Hibernate中找出如何配置实体关系

时间:2017-08-04 16:18:28

标签: java hibernate

是否可以从Hibernate(5)中检索实体之间的关系是如何配置的?

我的用例如下:我有一个Web服务,它提供(读取)对关系数据库中数据的访问。数据由多个实体组成,其中一些通过外键(通常的一对一,一对多,多对一,多对多)相关联。在请求数据时,客户端可以指定过滤器,并且在过滤器中,它们可以自由地遍历实体关系。有些事情需要将过滤器转换为Hibernate理解的东西。目前,我们正在生成Criteria

例如,假设我们有2个实体AB,其中属性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过滤器)更改请求内容。

到目前为止,我能够找到正确的实体并遵循属性路径,在此过程中遇到属性EntityMetadataCriterion并将所有过滤元素转换为单独的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 ;.谁能告诉我如何获取这些信息?

2 个答案:

答案 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%')

问题是我不知道名字idfk_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的笛卡尔积时,更多数据从服务器传输到客户端。我们通过表明我们只对不同的根实体感兴趣来得到预期的答案。变压器虽然在客户端运行,但它确实无助于减少流量。