2014-01-21 4 views
0

Что я пытаюсь сделать, так это присоединиться к таблице в другую таблицу на основе идентификатора пользователя.Play Framework Join Table

У меня есть таблица пользователей и таблица истории предупреждений, которая имеет внешний ключ, связанный с идентификатором пользователя.

Я использую сущности, созданные Netbeans 7.4.

Пользователь:

@Entity 
@Table(name = "Users", schema = "dbo") 
public class User extends Model implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "UserID") 
    private Integer userID; 
      @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "userId") 
      private Collection<AlertHistory> alertHistoryCollection; 
    { ... } 

Предупреждение История:

@Entity 
@Table(name = "Alert_History", schema = "dbo") 
public class AlertHistory extends Model implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "id") 
    private Long id; 
    @Basic(optional = false) 
    @Column(name = "user_id") 
    @ManyToOne(fetch = FetchType.EAGER) 
    private int userId; 
    @Basic(optional = false) 
    @Column(name = "message_id") 
    private long messageId; 
    @Basic(optional = false) 
    @Lob 
    @Column(name = "alerts_triggered") 
    private String alertsTriggered; 
      {...} 

То, что я бы ожидать, что, когда я загружаю пользователя, он будет пытаться присоединиться результаты AlertsHistory таблицы на основе USERID. Тем не менее, во время выполнения, то AlertsHistory Collection всегда null

Update: решаемые

Я смотрел на это неправильный путь. Чтобы сделать JOIN, AlertHistory ожидала передачи объекта User, а не только ключа userId. Добавив поле User в модель AlertHistory и сменив @OneToMany(mappedBy = "userId") на @OneToMany(mappedBy = "user", добавив @JoinColumn(name="user_id", referencedColumnName="userId") private User user; к этому полю User в AlertHistory, меня разобрали! Спасибо всем за помощь.

+0

В случае, если не atributte «частная int userId "at AlertHistory be" private User userId "? – edubriguenti

+0

Спасибо @edubriguenti, это был гвоздь в гробу! Я смотрел на все это неправильно. Я думал, что мне нужно передать ключ (userId), когда мне действительно нужно просто ссылаться на весь объект. Это привело меня к еще одной проблеме из-за того, что JPA вывел как столбец для сопоставления (т. Е. Искал столбец user_userId, который, конечно, не существует). Решение было добавить следующее 'AlertHistory': ' @JoinColumn (имя = "user_id", referencedColumnName = "идентификатор пользователя") частный пользователь User; ' –

ответ

0

С одной стороны, никто не хочет null коллекции, так что это в User:

private Collection<AlertHistory> alertHistoryCollection = new ArrayList<>(); 
//assuming Java 7 

Тогда вам нужен экземпляр User в AlertHistory так:

@ManyToOne(fetch = FetchType.EAGER) 
@JoinColumn(name = "UserID") 
private User user; 
+0

Спасибо Видью! Казалось, это немного подтолкнуло меня. Я также изменил тип коллекции с 'Collection' на' List'. Теперь я вижу более значимые (читай: любые) ошибки компиляции времени из игры: 'PersistenceException: ошибка на models.User.alertHistoryCollection. Свойство mappedBy [userId] не является ManyToOne? в [models.AlertHistory] ' Я убедился, что в поле userId в классе' AlertHistory' есть аннотация '@ ManyToOne'. –

+0

Прежде всего, у 'AlertHistory' не должно быть поля' userId', как я указал в своем первоначальном ответе. Он имеет экземпляр «Пользователь». Однако изначально я забыл предоставить атрибут '@ JoinColumn', который, как мне кажется, вам тоже нужен. Сделано редактирование. – Vidya