Спящий режим "JOIN ... ON"? - PullRequest
2 голосов
/ 22 марта 2010

У меня есть приложение, которое использует Hibernate для своих доменных объектов.Одна часть приложения является общей для нескольких приложений, и она не знает других систем.Для обработки отношений наш класс выглядит следующим образом:

@Entity
public class SystemEvent {
   @Id @GeneratedValue
   public int entity_id;

   @Column(name="event_type")
   public String eventType;

   @Column(name="related_id")
   public int relatedObjectId;
}

relatedObjectId содержит внешний ключ для одного из нескольких различных объектов, в зависимости от типа события.Когда система хочет узнать о событиях, которые имеют отношение к ее интересам, она захватывает все системные события с помощью eventType «NewAccounts» или чего-то подобного, и она знает, что все эти relatedObjectIds являются идентификаторами объекта «Пользователь» или аналогичными.

К сожалению, это вызвало проблему в будущем.Я не могу найти способ рассказать Hibernate об этом отображении, что означает, что HQL-запросы не могут выполнять объединения.Мне бы очень хотелось создать HQL-запрос, который выглядит следующим образом:

SELECT users FROM SystemEvent event join Users newUsers where event.eventType = 'SignUp'

Однако Hibernate не знает о взаимоотношениях между SystemEvent и Users, и, насколько я могу судить, нет никакого способаскажи это.

Итак, вот мой вопрос: есть ли способ сообщить Hibernate об отношениях, когда ваши доменные объекты ссылаются друг на друга через идентификационные номера, а не ссылки на классы?

1 Ответ

4 голосов
/ 22 марта 2010

Во-первых, когда у вас есть столбец с именем типа 'eventType', вы говорите о столбце дискриминатора.

Во-вторых, большая часть возможностей / удобства, которые обеспечивает ORM, заключается в возможности взаимодействия с вашими бизнес-объектами, а не с вашей базой данных.

Я бы взглянул на главу о наследовании в документах Hibernate.

Если вы можете, я бы установил абстрактный класс SystemEvent, который, как в вашем примере выше, просто имел бы и ID. Каждая конкретная реализация будет содержать определенное поле / свойство для relatedObject. Я обычно использую отображение «таблица на класс» или «таблица на подкласс» для этого типа сценария.

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class SystemEvent {
   @Id @GeneratedValue
   public int eventId;
}

@Entity
@PrimaryKeyJoinColumn(name="event_id")
public class SignupEvent extends SystemEvent {
   @Column(name="user_id")
   public User user;
}

@Entity
@PrimaryKeyJoinColumn(name="event_id")
public class OtherEvent extends SystemEvent {
   @Column(name="other_id")
   public OtherAssociatedObject otherAssociatedObject;
}

Вы бы изменили свой HQL, чтобы он выглядел так:

SELECT users FROM SignupEvent event join Users newUsers

Дайте мне знать, если вы хотите, чтобы я разъяснил какую-либо часть этого ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...