当前位置: 首页 > 面试题库 >

当我仅访问外键ID时,如何防止Hibernate提取联接的实体?

宗政文彬
2023-03-14
问题内容

我有一个Parent连接到另一个的Hibernate实体:Child。在数据库中,我有一列parent.child_id在上具有外键约束child.id。假设我正在延迟加载,那么当我加载的实例时,Parent我希望能够在parent.getChild().getId()不引起child表查找的情况下进行访问。

我希望返回的代理parent.getChild()能够完成请求Child.getId()因为它已经从parent.child_id列中加载了孩子的ID
。但是,我在child桌上看到另一个查询。

为什么需要这个额外的查询,我该如何避免呢?在这种情况下,我只对外键ID感兴趣,而不希望加载整个行。

类:

class Parent {
  @Id @Column(name = "id", unique = true, nullable = false)
  private Integer id;

  @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "child_id")
  private Child child;
}

class Child {
  @Id @Column(name = "id", unique = true, nullable = false)
  private Integer id;

  @Column(name = "name")
  private String name;
}

表格:

CREATE TABLE child (
    id int PRIMARY KEY,
    name varchar(10)
);

CREATE TABLE parent (
    id int PRIMARY KEY,
    child_id int REFERENCES (child.id)
);

问题答案:

这是由于Child使用字段访问(由于在字段上放置了注释)这一事实引起的,因此,当您调用任何一种方法时,Hibernate都会简单地初始化代理。

如果将注释移到属性,它将按预期工作。

从JPA 2.0(Hibernate 3.5)开始,您可以用细粒度的方式对其进行配置:

@Access(AccessType.FIELD) // Default is field access
class Child {
    private Integer id;

    @Column(name = "name")
    private String name;

    @Access(AccessType.PROPERTY) // Use property access for id
    @Id @Column(name = "id", unique = true, nullable = false)
    public Integer getId() { ... }

    ...   
}


 类似资料:
  • 问题内容: 我有一些看起来像这样的Hibernate实体(省略了getter和setter): 当我查询EntityA时,它的加载情况很好,父关联被Hibernate代理(因为它是惰性的)代替了。如果要访问父母的ID,请执行以下调用: 据我了解,该调用不应往返于数据库,因为Id存储在EntityA表中,并且代理应仅返回该值。但是,在我的情况下,这会生成一条SQL语句,该语句将提取EntityB并仅

  • 问题内容: 我的网站上有一个说 “ check.php” 的php文件,在提交表单时执行。 说我的网站是 “ myweb.com” ,而php文件在目录“ PHP”中 我想防止直接访问“ check.php”文件的网址,即,如果有人键入网址“ **_myweb.com/PHP/check.php_** ”,则不应执行该php文件,而应返回一条错误消息。 我试图通过在.htaccess中设置规则来阻

  • 我们有一个例子,我们要查询出历史信息,我们希望使用QueryDSL而不是原始SQL。历史表中的数据包含原始记录的id(Hibernate ENVERs),如果发生删除,则删除实际记录,但ENVERs记录包含原始id。 我们面临的问题是,由于创建Q类的实体只引用外键,这将强制SQL中的联接。由于使用Hibernate,我们无法引用多个字段的列。 null

  • 问题内容: 我使用Minify来缩小并缓存所有脚本请求。 我只希望我的用户能够访问JavaScript文件的缩小版本。 Minify位于,我的脚本位于。如何阻止直接访问未缩小的JavaScript文件所在的位置。我宁愿不要将它们从文档根目录中删除,但这是一个选择。 请注意,我使用的是Zend Framework,因此应用程序的实际根目录已移至。htaccess文件可处理重写。 问题答案: 您不能仅

  • 问:我们如何防止主机提供商访问我们的数据? > 我们不希望宿主提供程序的用户登录Sql Server并查看数据。 我们不希望盒子里有数据库文件的未加密副本。

  • 假设我有两个表,称为 student 和 class.class id 是 student 表中的外键。某些学生的班级 ID 列也可能为空(表示没有为他们分配任何班级)。如果我们使用 spring jpa 为这些学生获取数据,则类实体对象将为 null。我宁愿想要一个空对象而不是null,这样就可以避免手动空检查。如何实现此目的? 学生实体-学生Id、姓名、年龄、班级Id 班级实体-班级Id、班级