2014-01-21 5 views
0

내가하려는 것은 사용자 ID를 기반으로 테이블을 다른 테이블에 조인하는 것입니다.Play Framework Join Table

사용자 테이블과 사용자 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 객체를 넘겨 줄 것을 기대하고있었습니다. User 필드를 모델에 추가하고 @OneToMany(mappedBy = "userId")@OneToMany(mappedBy = "user"으로 변경 한 다음 User 필드에 @JoinColumn(name="user_id", referencedColumnName="userId") private User user;을 추가하면 AlertHistory 필드가 나옵니다. 모두 도움을 주셔서 감사합니다. 한 가지 들어

+0

해야 atributte "개인 없습니다 int userId "는 AlertHistory에서"private User userId "가됩니까? – edubriguenti

+0

감사합니다 @ didubriguenti, 그건 관 속에 못을 박았다! 나는이 모든 것을 잘못보고 있었다. 실제로 전체 객체를 참조 할 필요가있을 때 키 (userId)를 전달해야한다고 생각했습니다. JPA가 일치시킬 열로 추측했기 때문에 (즉, 존재하지 않는 user_userId라는 열을 찾고 있었기 때문에) 다른 문제가 발생했습니다. 해결책은 AlertHistory에 다음을 추가하는 것입니다 : @JoinColumn (name = "user_id", referencedColumnName = "userId") 개인 사용자 사용자, ' –

답변

0

, 아무도 null 컬렉션을 원하는, 그래서 User에서이 작업을 수행 : 다음

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

는이 같은 AlertHistoryUser 인스턴스를 필요

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

Vidya! 이것은 겉으로는 나에게 조금 더 가까워졌다. 또한 콜렉션 유형을'Collection'에서'List'로 변경했습니다. Play에서 더 의미있는 (read : any) 컴파일 타임 오류가 발생했습니다. PersistenceException : models.User.alertHistoryCollection에서 오류가 발생했습니다. mappedBy 속성 [userId]가 [models.AlertHistory]의 ManyToOne이 아닙니다. ' 'AlertHistory' 클래스의 userId 필드에'@ ManyToOne' 주석이 있음을 확인했습니다. –

+0

우선, 'AlertHistory'는 원래의 답변에서 말한 것처럼'userId' 필드를 가지고 있지 않아야합니다. 그것은'User' 인스턴스를 가지고 있습니다. 그러나, 나는 원래 @ JoinColumn' 속성을 제공하는 것을 게을리했다. 나는 당신도 필요하다고 생각한다. 만든 수정. – Vidya