Java “休眠覆盖”;懒惰=错误”;

Java “休眠覆盖”;懒惰=错误”;,java,hibernate,jpa,lazy-loading,hibernate-mapping,Java,Hibernate,Jpa,Lazy Loading,Hibernate Mapping,我正在现有项目中开发一个新模块。该项目已经有一个用户表、一个pojo和一个相应的映射文件。问题是,他们通过提及lazy=“false”急切地获取所有属性。但是,在我的模块中,我在一个请求中进行了大量的读写操作,所以我不想急于获取。我想知道的是,是否可以为同一个表和同一个pojo创建另一个映射文件,以便惰性地加载所有属性?我尝试为映射文件分配不同的实体名称,但在部署时,我遇到了错误“实体映射中的重复列” 我看到了答案,但它说“不要映射子对象”,那么我将如何获取代理?我想,您的问题是不要加载关联实体

我正在现有项目中开发一个新模块。该项目已经有一个用户表、一个pojo和一个相应的映射文件。问题是,他们通过提及lazy=“false”急切地获取所有属性。但是,在我的模块中,我在一个请求中进行了大量的读写操作,所以我不想急于获取。我想知道的是,是否可以为同一个表和同一个pojo创建另一个映射文件,以便惰性地加载所有属性?我尝试为映射文件分配不同的实体名称,但在部署时,我遇到了错误“实体映射中的重复列”


我看到了答案,但它说“不要映射子对象”,那么我将如何获取代理?

我想,您的问题是不要加载关联实体,egarly? 在以下情况下: FetchType.LAZY=除非通过getter显式调用,否则不会加载关系。 FetchType.EAGER=加载所有默认关系

在你的情况下,如果我的理解是正确的,那么使用 lazy=“false” fetch=“select”因此它将通过getter按需选择。 检查此url,它将给出更清晰的想法: 关键在于,如果使用两个不同的java类,那么可以将同一个表映射两次。在您的情况下,如果您知道设置lazy=“true”就足够了:

  • 创建pojo的空子类
  • 按照您希望的方式将子类映射到同一用户表(例如复制粘贴现有映射和更改惰性属性值)
  • 在您创建的模块中,仅使用子类

  • 这是使用即时抓取作为默认策略的一个主要缺点。通常你会有一个懒惰的孩子收集,你可以

    值得一提的是(由实体映射给出的映射),这样您就可以显式地指定要获取的内容

    对于条件查询,您可以尝试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
      用法应尽可能用
      BaseDaoX
      替换(无直接JPA映射)

    因此,您可以使用
    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 ;
    }