Java “休眠覆盖”;懒惰=错误”;
我正在现有项目中开发一个新模块。该项目已经有一个用户表、一个pojo和一个相应的映射文件。问题是,他们通过提及lazy=“false”急切地获取所有属性。但是,在我的模块中,我在一个请求中进行了大量的读写操作,所以我不想急于获取。我想知道的是,是否可以为同一个表和同一个pojo创建另一个映射文件,以便惰性地加载所有属性?我尝试为映射文件分配不同的实体名称,但在部署时,我遇到了错误“实体映射中的重复列”Java “休眠覆盖”;懒惰=错误”;,java,hibernate,jpa,lazy-loading,hibernate-mapping,Java,Hibernate,Jpa,Lazy Loading,Hibernate Mapping,我正在现有项目中开发一个新模块。该项目已经有一个用户表、一个pojo和一个相应的映射文件。问题是,他们通过提及lazy=“false”急切地获取所有属性。但是,在我的模块中,我在一个请求中进行了大量的读写操作,所以我不想急于获取。我想知道的是,是否可以为同一个表和同一个pojo创建另一个映射文件,以便惰性地加载所有属性?我尝试为映射文件分配不同的实体名称,但在部署时,我遇到了错误“实体映射中的重复列” 我看到了答案,但它说“不要映射子对象”,那么我将如何获取代理?我想,您的问题是不要加载关联实体
我看到了答案,但它说“不要映射子对象”,那么我将如何获取代理?我想,您的问题是不要加载关联实体,egarly? 在以下情况下: FetchType.LAZY=除非通过getter显式调用,否则不会加载关系。 FetchType.EAGER=加载所有默认关系 在你的情况下,如果我的理解是正确的,那么使用 lazy=“false” fetch=“select”因此它将通过getter按需选择。 检查此url,它将给出更清晰的想法: 关键在于,如果使用两个不同的java类,那么可以将同一个表映射两次。在您的情况下,如果您知道设置lazy=“true”就足够了:
这是使用即时抓取作为默认策略的一个主要缺点。通常你会有一个懒惰的孩子收集,你可以 值得一提的是(由实体映射给出的映射),这样您就可以显式地指定要获取的内容 对于条件查询,您可以尝试FetchMode.LAZY,尽管它已被弃用
另一种否决急切抓取的方法是使用。通过这种方式,您可以指定要获取的内容,并且将延迟获取实体图中未包含的所有急切获取属性 就像弗拉德·米哈尔恰所说的,使用标准API它会起作用。我试过:)
至少,您不必更改现有的hbm文件一些其他方法就可以做到这一点,我们使用了基于JPA继承(
@MappedSuperclass
)和/或数据库视图的方法,并使用以下伪代码进行了示例(它对急切->懒惰->急切场景都有效):
- 我们的
用于其他类似代码:DaoX
DaoX x ; @Entity class DaoZ { DaoX x ; }
@Table( name = "table_x" )
@MappedSuperclass
class abstract BaseDaoX { /* ... other stuff ... */ }
@Entity
class DaoX extends BaseDaoX { @...( fetch = FetchType.EAGER ) refY ; }
@Entity
class DaoXLazy extends BaseDaoX { @...( fetch = FetchType.LAZY ) refY ; }
- 我们的
用法应尽可能用DaoX
替换(无直接JPA映射)BaseDaoX
DaoXLazy
或DaoZLazy
来实现所需的场景
通过视图(在懒惰->急切的场景中)
(如果您可以将当前的EAGER
更改为LAZY
,这通常更合适)
你可以用最小的负载映射你的(可能是深度嵌套的)懒惰的东西,例如这样(我们喜欢在这里加载prop_f1
和prop_b1
)
--db视图:
创建或替换视图
挑选
德克萨斯州*,
f、 f1号提案,
b、 b1号提案
来自表x tx
--为简单起见,假设tx:f~1:1和f:b~1:1:
左外部联接表\u foo f on(f.id=tx.foo\u id)
左侧外部联接表\u栏b打开(b.id=f.bar\u id)
嗨,我正在使用你的MappedSuperClass继承策略。但是,我在“字段列表”中得到了“未知列”结构0\u0.project\u lazy\u id,其中hibernate正在更改外键。我不知道如何保持默认状态。尝试了@JoinColumn等。在这里查看我的代码:嗨@Ryan,请在某个hibernate论坛上提问,或者问一个关于stackoverflow的新问题,因为我现在帮不了你。你可以在这里用评论把别人引向你的问题。
DaoX x ;
@Entity
class DaoZ { DaoX x ; }
@Table( name = "table_x" )
@MappedSuperclass
class abstract BaseDaoX { /* ... other stuff ... */ }
@Entity
class DaoX extends BaseDaoX { @...( fetch = FetchType.EAGER ) refY ; }
@Entity
class DaoXLazy extends BaseDaoX { @...( fetch = FetchType.LAZY ) refY ; }
BaseDaoX x ;
@Entity
class DaoZ { DaoX x ; }
@Entity
class DaoZLazy { DaoXLazy x ; }
@Table( name = "view_x_eager" )
class DaoXEager extends BaseDaoX {
@...( fetch = FetchType.EAGER ) refY ;
String prop_f1 ;
String prop_b1 ;
}