hibernate GetAssociation()上的积极优化。getId()?

hibernate GetAssociation()上的积极优化。getId()?,hibernate,optimization,lazy-loading,Hibernate,Optimization,Lazy Loading,我经常有这样的使用场景: 实体A通过1-1关系连接到B 在代码中,我通常只使用A.*和A.getB().getId(),我从不使用B()的任何其他属性, 由于B的Id实际上已经存储在表A中,因此我不必加载 B表,但hibernate在看到getB()时总是创建联接或后一个选择。 如果B表很大,或者它有自己的关联,这将是一个巨大的问题 有没有办法针对这个特殊用例进行优化 谢谢 Yang我认为这是不可能的,因为Hibernate不知道getId()方法的作用:它可能只返回ID(99%的情况下可能是这

我经常有这样的使用场景:

实体A通过1-1关系连接到B

在代码中,我通常只使用A.*和A.getB().getId(),我从不使用B()的任何其他属性, 由于B的Id实际上已经存储在表A中,因此我不必加载 B表,但hibernate在看到getB()时总是创建联接或后一个选择。 如果B表很大,或者它有自己的关联,这将是一个巨大的问题

有没有办法针对这个特殊用例进行优化

谢谢
Yang

我认为这是不可能的,因为Hibernate不知道getId()方法的作用:它可能只返回ID(99%的情况下可能是这样),但它也可以转换ID,产生一些副作用,在某处记录一些消息,等等

我不是绝对确定,但我认为您可以将表A中的B_ID列映射为基本列(除了映射为联接列之外),前提是您将该列标记为不可插入和不可更新。如果我是正确的,您可以调用a.getBId()来获取B的ID,而不必延迟加载B。

基本上,您需要将注释放在getId()上,而不是放在私有整数Id上


就xml映射文件而言,您只需将access=“property”放在类的标记中即可

非常感谢,这种方法确实有效。我也在考虑使用本机sql,并将结果分配给只部分构造B实例,这样我们就构造了一个B,但B只填充了它的Id,其余的可以根据需要加载。但是我不知道语法应该是什么。这样我们就不需要更改映射。可能类似于“从”?“中选择A.*,A.B_ID作为{B.ID}”???我对冬眠还很陌生