2014-01-21 127 views
0

我想要做的是加入一個表到另一個表基於用戶ID。玩框架加入表

我有一個用戶表和一個警報歷史記錄表,其中有一個外鍵與用戶的ID相關聯。

我使用由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; 
      {...} 

我期望的是,當我打開一個用戶,它會嘗試加入基於該用戶id的AlertsHistory表結果。然而,在運行時,AlertsHistory集合總是null

更新:解決

我一直在尋找這個錯誤的方式。爲了做一個JOIN,AlertHistory希望交給一個用戶對象,而不僅僅是userId鍵。添加User場到AlertHistory模式,並改變@OneToMany(mappedBy = "userId")@OneToMany(mappedBy = "user",然後在AlertHistory加入@JoinColumn(name="user_id", referencedColumnName="userId") private User user;User場讓我整理出來!感謝大家的幫助。

+0

應該不是atributte「私人int userId「在AlertHistory是」私人用戶userId「? – edubriguenti

+0

謝謝@edubriguenti,那是棺材裏的釘子!我看着這一切都是錯誤的。當我真的需要簡單地引用整個對象時,我想我需要傳遞鍵(userId)。這讓我陷入了另一個問題,因爲JPA推斷爲匹配的列(即它正在尋找名爲user_userId的列當然不存在)。 解決方案有以下內容添加到'AlertHistory': '@JoinColumn(name =「user_id」,referencedColumnName =「userId」) 私人用戶用戶;' –

回答

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

謝謝Vidya!這似乎讓我更接近了一點。我也將集合類型從'Collection'改爲'List'。我現在看到更多有意義的(閱讀:任何)來自Play的編譯時錯誤: 'PersistenceException:models.User.alertHistoryCollection上的錯誤。在[models.AlertHistory]' 中,mappedBy屬性[userId]不是ManyToOne?我已確保'AlertHistory'類中的userId字段上存在'@ ManyToOne'註釋。 –

+0

首先,'AlertHistory'不應該有像我在原始答案中所述的'userId'字段。它有一個'User'實例。但是,我最初忽略提供'@ JoinColumn'屬性,我認爲你也需要它。編輯。 – Vidya