我在下面有一个简单的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)
然后它工作正常,所以似乎级联导致多余的左外连接。
任何帮助?
答案 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,则在合并时不会加载它,因此它不必加载它来合并更改。