JPA / Hibernate Cascade ALL вызывает избыточное левое внешнее соединение - PullRequest
2 голосов
/ 13 марта 2012

У меня есть простой 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);

ПроблемаЯ сталкиваюсь с тем, что в спящем режиме, прежде чем пользователь слияния выполняет выбор из базы данных, который является более сложным, чем это должно быть.Более конкретно, выбор делает левое внешнее объединение с определенным выше отношением «дружеские отношения» (таблица) (отношение OneToMany).

Любой совет, чтобы избежать этого?

если я изменю это:

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

тогда все работает нормально, поэтому кажется, что каскад вызывает избыточное левое внешнее соединение.

какая-нибудь помощь?

Ответы [ 2 ]

2 голосов
/ 14 марта 2012

я наконец решил вырвать каскады и сам позаботиться об отношениях.Каскады добавили сложности в SQL (объединения) и понизили производительность.

Я думаю, что проблема с каскадами требует дальнейшего обсуждения здесь.

Подумайте о сущности позвоночника, такой как ПОЛЬЗОВАТЕЛЬ, которая имеет некоторые базовые поля (fname, lname и т. Д.) И множество связей с другими сущностями, такими как (FRIENDSHIPS, PRIVATE_MESSAGES и т. Д.)

Еслия использую каскад (CascadeType.ALL) в любое время, когда я хочу объединить спящий режим USER, получить объект из базы данных, но также добавляет улучшение производительности, извлекающее также состояние некоторых отношений (например, FRIENDSHIPS), которое в большинстве случаев является избыточным.

Я также прилагаю еще один пост, описывающий ту же проблему:

Использование опционально каскадов в Hibernate / JPA

Может, кто-нибудь с большим опытом даст здесь какой-нибудь совет?

Лично я выбрал удаление каскадов и ручную обработку всех взаимосвязей.

0 голосов
/ 13 марта 2012

левое внешнее объединение - это повышение производительности для извлечения пользователя и загруженной ассоциации за один раз, которое необходимо для слияния, чтобы узнать состояние базы данных.если вы установите его как lazy, он не загружается при объединении, и поэтому ему не нужно загружать его для объединения изменений.

...