- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在创建 @ManyToOne 关联以延迟加载时遇到了一些麻烦。我正在使用 fetch=LAZY 但是当主键列没有进行连接时它不起作用。
我知道这个问题已经是 asked但我认为它没有得到正确的回答,所以我提供了详细的信息来澄清这个问题。
这是我的模型:
DummyB -> DummyA
这些是表格:
create table dummyA (
id number(18,0), --pk
name varchar2(20) -- unique field
);
create table dummyB (
id number(18,0),
dummya_id number(18,0),
dummya_name varchar2(20)
);
这些是实体:
@Entity
public class DummyA implements Serializable {
private Long id;
private String name;
@Id
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Entity
public class DummyB implements Serializable {
private Long id;
private DummyA dummyA;
@Id
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
/* Case 1: mapping DummyB -> DummyA by DummyA NON primary key (field name) */
// @ManyToOne(fetch = FetchType.LAZY)
// @JoinColumn(name = "dummya_id")
// public DummyA getDummyA() {
// return dummyA;
// }
/* Case 2: mapping DummyB -> DummyA by DummyA primary key */
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "dummya_name", referencedColumnName = "name")
@LazyToOne(LazyToOneOption.PROXY)
public DummyA getDummyA() {
return dummyA;
}
public void setDummyA(DummyA dummyA) {
this.dummyA = dummyA;
}
}
注意实体 DummyB 中的 getDummyA 方法是重复的,以尝试两种情况来加入实体。
public class DummyTest {
@Autowired
HibernateTransactionManager transactionManager;
@Test
@Transactional
public void testFindDummyB() throws DAOException {
Long idDummyB = 2L;
Session session = getCurrentHibernateSession();
List lst = session.createCriteria(DummyB.class)
.add(Restrictions.eq("id", idDummyB)).list();
assertTrue(lst.size() > 0);
}
private Session getCurrentHibernateSession() {
return this.transactionManager.getSessionFactory().getCurrentSession();
}
}
我的图书馆:
@LazyToOne
至getDummyA()
方法没有任何效果。 @ManyToOne(fetch = FetchType.LAZY, optional = true)
@JoinColumn(name = "dummya_name", referencedColumnName = "name")
@LazyToOne(LazyToOneOption.PROXY)
@Column(unique = true)
在 DummyA getName()
方法没有成功。 optional=true
或 false
根据建议 here也没有效果。 setFetchMode
强制延迟加载在标准不起作用时, DummyA select 继续执行。 List lst = session.createCriteria(DummyB.class)
.add(Restrictions.eq("id", idDummyB)).
setFetchMode("dummyA", FetchMode.SELECT)
.list();
我在 Hibernate 的文档中找不到引用此行为的点,所以我想知道我的注释中是否有任何问题,或者我遇到了 Hibernate 错误。
最佳答案
看到与 Hibernate 5.0.4 完全相同的行为。 @ManyToOne
(倒数 OneToMany
)和 Lazy
如果连接列是主键,则提取工作完美。如果不是,延迟加载会中断,Hibernate 会急切地获取所有 ManyToOne
的每次实例化一个对象。如果您执行 Criteria.list()
,这可能会非常缓慢。例如,1000 条记录。最初对 1000 条记录的单个查询可以膨胀为 5000 个查询,以急切地获取各种 @ManyToOne
使用个人选择。
绝对没有任何我能够测试/更改的东西以任何方式解释了这一点,我可以可靠地重现它。
我必须在我的使用非 PK 连接的应用程序中实现的解决方案就是丢弃 @ManyToOne
。/@OneToMany
注释对和手动写入集合获取(使用 transient 变量缓存结果)。工作量更大,但性能要高得多,因为我的一些对象有 5 或 6 个 @ManyToOne
对象和所有这些都被 Hibernate 通过单独的选择热切地获取。
不幸的是,我无法重新组织架构以适应 Hibernate 中的这种怪癖。我正在做一个涉及 Heroku Connect 的项目,当合并来自 Salesforce.com 的数据时,表之间的连接是使用表中不是主键的“sfid”列完成的。主键是 Heroku Postgres 数据库中记录的唯一值,不能用于连接,因为数据库中没有其他表引用此主键。
我假设这是 Hibernate 中的一个错误;我读过或能够修改的任何内容都不会以任何方式影响此行为,并且正如我所提到的,如果连接列是主键,我可以使系统完全按预期工作。
关于hibernate - @ManyToOne(fetch = FetchType.LAZY) 不适用于非主键引用的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30082281/
我有一些字段标记为 LAZY 的实体.为了加载LAZY字段只是在 session 打开时访问 getter,因此 ORM 代理执行 select子查询。 但是,当您需要完全解析的对象作为由 join
为什么应该使用 FetchType.LAZY 和 FetchMode.JOIN 而不是 FetchType.EAGER?。FetchType.LAZY 和 FetchMode.JOIN 等于 Eage
我有以下模型: public class Parent { @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mapped
我有以下代码: @Entity public class Foo { @OneToMany(mappedBy = "Foo", fetch = FetchType.LAZY) @Cascade
我的实体: @Entity @NoArgsConstructor public class Company { @Id @Getter @GeneratedValue(strategy =
假设我有一个关联, class Department{ ...... @OneToMany(fetch = FetchType.LAZY) private List employees; } 现在,当
在我的实体中,我必须使用 fetch = FetchType.EAGER 因为我有一个错误: nested exception is org.hibernate.LazyInitializationE
我构建了一个存储在数据库中的树结构。该关系建立在数据库表中的 id、parent_id 列上。我正在使用 Spring Data 和 Hibernate。 为了访问树结构,我构建了一个实体类“Node
我无法从数据库加载对象及其相对映射对象。可能我的“ map 系统”是错误的。 在数据库中保存对象(及其相对映射对象)时,一切正常,因此对象似乎已正确映射。 Utente是我的“主”对象 publ
我现在想知道 Hibernate 中的 CascadeType 和 FetchType 有什么区别? 它们看起来很相似,但我猜它们不能互换,对吧?什么时候使用它们?它们可以同时使用吗? 最佳答案 这是
使用 JPA (EntityManager) 和 Hibernate。 我有一个包含 3 个集合的类,一个包含 FetchType.EAGER,另外两个包含 LAZY。如果我将其中的 3 个放在 EA
我需要与FetchType.EAGER(下面的示例)建立关系,但我有异常(exception)。如果我将 FetchType.EAGER 更改为 FetchType.LAZY 一切正常,但我确实需要
我对大型应用程序中的 EAGER 关系有疑问。此应用程序中的某些实体与其他实体具有 EAGER 关联。这在某些功能中成为“毒药”。 现在我的团队需要优化此功能,但我们无法将提取类型更改为 LAZY,因
指定lazy = "true"有什么区别并使用 fetch = "select" or "join" ?哪个比另一个更受欢迎? 问候 贾延德拉 最佳答案 假设我们有这样的实体: @Entity @Ta
我的应用程序使用 JPA (Hibernate) 和 Spring。我的优点是: 部门 @Entity @Table(schema = "myschema") public class Departm
我正在使用 JPA 在 Java EE( Jersey )中制作一个应用程序,但我遇到了未初始化实体的问题。我有 3 个实体“汽车”、“车主”、“房屋”,其中汽车可以有多个车主,车主可以有多个房屋。当
我有模型类别。它可能有父类别和子类别列表。我写这个问题是因为找不到实体与他自己相关的情况。 我试着这样实现它: @Entity public class Category { @Id private
我有一个名为“成员(member)”的类(class),其中有一个音乐列表。当检索成员对象时,代码遇到以下异常。 我需要将音乐列表设置为“惰性”,并在需要时检索它们,而不是在读取成员(member)详
Hibernate 新手尝试理解 LAZY 和 EAGER 抓取之间的差异。 地址模型: @Entity public class Address { @Id @GeneratedVa
我将 Spring Boot 2 与 Hibernate 一起使用,并且我有一个名为 ItemCarga 的实体: @ManyToMany(cascade = { CascadeType.DETACH
我是一名优秀的程序员,十分优秀!