休眠问题,使复合密钥无法正常工作

马克伯纳德

我有一个叫做WebAsset的类:

public class WebAsset {
    private Long id;
    private String url;
    private int status;
    //more fields that are not relevent
}

我需要能够显示WebAsset之间的关系,因此我为该关系表和一个复合键类创建了一个表。

public class WebAssetReferencePK {
    private Long sourceAssetId;
    private Long targetAssetId;
}

public class WebAssetReference {
    private WebAssetReferencePK wpk;
    private Long updateTime;
}

我们被迫使用旧版本的Hibernate,因此我们需要使用xml文件而不是注释。这是参考类的映射:

<class name="ca.gc.cra.www.crawler.valueobject.WebAssetReference" table="webassetreference">
    <composite-id name="webAssetReferencePK" class="ca.gc.cra.www.crawler.valueobject.WebAssetReferencePK">
        <key-property name="sourceAsset" type="java.lang.Long" column="sourceAssetId" />
        <key-property name="targetAsset" type="java.lang.Long" column="targetAssetId" />
    </composite-id>
    <property name="updateTime" type="java.lang.Long" column="updatetime" not-null="true" />
</class>

在组合键中,我得到了我期望的具有2个彼此相关的ID的数据库。但是,当我尝试使用HQL或Criteria查询时,它不起作用,因为PK类与WebAsset之间没有直接关系,因此我需要能够在WebAsset和WebAssetReference之间进行联接。如果我尝试将组合键类型从java.lang.Long更改为WebAsset,则休眠将整个对象存储在WebAssetReference表中,而不仅仅是ID。

我要尝试执行的一个示例是,如果我有一个sourceAssetId,我想返回具有相同源的所有targetAssetId,但是我不想要ID本身,而是想要WebAsset作为每个targetAssetId的主键。

我一直在寻找答案,但我能找到的每个示例都是与之无关的简单示例。

更新1:通过继续搜索,我终于找到了答案。而不是密钥属性,我需要使用“多对一”密钥。我还没有尝试加入,但是其他一切看起来都不错,所以这应该是答案。

更新2:无法使查询与HQL一起使用。这是我正在尝试执行的SQL:

select * from webasset as wa join webassetreference as war on war.targetassetid=wa.webasset_id where war.sourceassetid=?

这是无法使用的HQL:

FROM WebAsset JOIN WebAssetReference WebAssetReference.WebAssetReferencePK.targetAsset=WebAsset WHERE WebAssetReference.WebAssetReferencePK.sourceAsset = :sourceAsset

我收到有关HQL的以下错误:错误-行1:89:意外令牌:。

我会继续尝试,但似乎无法弄清HQL。

马克伯纳德

我发现了如何做到这一点。在上面的情况下,由于我有2列连接到同一表,因此它将不起作用。但是,如果我使用上面相同的WebAsset类,而改用此类:

 public class TreeNode implements Comparable<TreeNode>{

    private String nodeUrl;
    private Long id;
    private Boolean folder;
    private transient WebAsset nodeAsset = null; 
}

使用此.hbm.xml文件:

<class name="ca.gc.cra.www.crawler.valueobject.TreeNode" table="TreeNode">
    <id name="id" type="java.lang.Long" column="treenode_id" >
        <generator class="identity"/> 
    </id>
    <many-to-one name="nodeAsset" class="ca.gc.cra.www.crawler.valueobject.WebAsset" column="nodeAsset_id" lazy="false" not-null="false" cascade="none" unique="true" />
    <property name="folder" type="java.lang.Boolean" column="folder" not-null="true" />
    <property name="nodeUrl" length="512"  type="java.lang.String" column="nodeUrl" not-null="true" />

    <set name="children" table="TreeNode" inverse="false" lazy="true" >
        <key column="parentnode_id"/>
            <one-to-many class="ca.gc.cra.www.crawler.valueobject.TreeNode" />
    </set>
</class>

然后,您可以使用以下代码来检索联接:

Session session = HibernateUtil.getSession();
try {
    String hql = "FROM TreeNode tn JOIN tn.nodeAsset WHERE tn.id=5";
    Query query = session.createQuery(hql);
    List result = query.list();
    System.out.println("done");
} catch (HibernateException e) {
    e.printStackTrace();
    throw new Exception("Query failed", e);
} finally {
    session.flush();
    session.close();
}

Hibernate然后可以正确执行联接。结果将是一个List,其中包含每个条目的Object数组。该对象包含属于联接的2个类。您必须使用(Object [])强制转换对象以访问元素,然后将其强制转换为适当的类。

我建议不要使用这种方法,因为Hibernate也会尝试加载所有连接的类。在上面的示例中,我从TreeNode中获得了1行,但它生成了19条select语句。我什至试图将连接的类设置为延迟加载,但仍会生成所有选择。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

休眠使复合密钥无法正常工作

来自分类Dev

休眠:HQL无法正常工作

来自分类Dev

休眠搜索索引无法正常工作

来自分类Dev

休眠的懒惰获取无法正常工作

来自分类Dev

休眠-@Transactional无法正常工作吗?

来自分类Dev

Kafka分区密钥无法正常工作

来自分类Dev

Wacom Intuos Express密钥无法正常工作

来自分类Dev

使用复合键更新表无法正常工作

来自分类Dev

usb复合设备无法与usb 3.0正常工作

来自分类Dev

MongoDB MapReduce复合密钥问题

来自分类Dev

MongoDB MapReduce复合密钥问题

来自分类Dev

使用oracle序列进行休眠根本无法正常工作

来自分类Dev

休眠更新有时无法正常工作

来自分类Dev

休眠onetomany注释fetch = FetchType.LAZY无法正常工作

来自分类Dev

类路径问题:Gradle无法正常工作

来自分类Dev

Topmargin 0无法正常工作?缓存问题?

来自分类Dev

解决小问题(无法正常工作)

来自分类Dev

pandas.replace的问题无法正常工作

来自分类Dev

str_replace的问题无法正常工作

来自分类Dev

由于背光问题,挂起无法正常工作

来自分类Dev

跨域问题-jsonp无法正常工作

来自分类Dev

Django导入问题无法正常工作

来自分类Dev

与Rails的简单关联问题,无法正常工作

来自分类Dev

“此设备无法正常工作”-Wifi问题

来自分类Dev

drawable无法正常工作(渲染问题)

来自分类Dev

Javascript:&& 语句无法正常工作的问题

来自分类Dev

MYSQL InnoDB唯一密钥无法正常工作?

来自分类Dev

检测输入密钥js-无法正常工作

来自分类Dev

使用自定义密钥的数据联接无法正常工作