JPA / Hibernate Cascade ALL导致冗余的左外连接

时间:2012-03-13 15:30:16

标签: hibernate jpa join cascade

我在下面有一个简单的Entity GeneralUser(不需要字段)

public class GeneralUser
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

private String fname;

@OneToMany(mappedBy = "fromGeneralUser", targetEntity = Friendship.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private Collection<Friendship> friendships;
}

让我举一个非常简单的例子来说明我的意思:

GeneralUser user = generalUserService.find(id);
user.setFname("foo")
user = generalUserService.merge(user);

我面临的问题是,在合并用户执行数据库选择之前,hibernate会比应该更复杂。更具体的是,select使左上外连接具有上面定义的“友谊”关系(表)(关系OneToMany)。

要避免这种提示吗?

如果我改变了这个:

@OneToMany(mappedBy = "fromGeneralUser", targetEntity = Friendship.class, fetch = FetchType.LAZY, cascade = CascadeType.DELETE)

然后它工作正常,所以似乎级联导致多余的左外连接。

任何帮助?

2 个答案:

答案 0 :(得分:2)

我终于决定撕掉级联并自己照顾关系。 Cascades增加了SQL(连接)的复杂性和性能开销。

我认为级联问题需要在这里进行更多讨论。

考虑像USER一样的后骨实体,它有一些基本字段(fname,lname等等)和许多与其他实体的关系,如(FRIENDSHIPS,PRIVATE_MESSAGES等)

如果我在任何时候使用cascade(CascadeType.ALL)我想合并一个USER hibernate从数据库中获取实体,还会增加性能改进,同时获取一些关系的状态(例如FRIENDSHIPS),这在大多数情况下都是多余的。

我还附上另一篇描述同一问题的帖子:

Using cascades optionally in Hibernate/JPA

也许任何有经验的人都可以在这里找到任何建议吗?

我个人选择撕掉级联并手动完成所有关系。

答案 1 :(得分:0)

左外连接是一种性能改进,用于一次性获取用户和加载的关联,这是合并知道数据库状态所需的。如果你将它设置为lazy,则在合并时不会加载它,因此它不必加载它来合并更改。

相关问题