2017-09-06 19 views
0

我正在將現有項目轉換爲使用Hibernate。我有這樣一個類:什麼是使用Hibernate註釋一個外部id的類的正確方法?

@Entity 
@Table(name = "user") 
public class User { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "user_id") 
    private Long userId; 

    @Column(name = "group_id_user") 
    private Long groupId; 

    @Column(name = "name") 
    private String name; 

    ... 
    // getters and setters.... 
} 

和一類這樣的:

@Entity 
@Table(name = "group") 
public class Group { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "group_id") 
    private Long groupId; 

    @Column(name="group_name") 
    private String groupName; 

    ... 
    // getters and setters.... 
} 

user表命名"group_id_user"列應該是一個外鍵在group命名"group_id"列表。

讓這些類如上所示結構化,或者它們的結構如下所示,以確保數據庫中存在外鍵是否正確或「正確」?

@Entity 
@Table(name = "user") 
public class User { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "user_id") 
    private Long userId; 

    @ManyToOne 
    @JoinColumn(name = "group_id_user") 
    private Group group; 

    @Column(name = "name") 
    private String name; 

    ... 
    // getters and setters.... 
} 

@Entity 
@Table(name = "group") 
public class Group { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "group_id") 
    private Long groupId; 

    @Column(name="group_name") 
    private String groupName; 

    ... 
    // getters and setters.... 
} 

我一直在使用這兩種格式的嘗試,但有問題的兩種方式。當我使用第一種格式時,我在創建查詢時遇到了連接的HQL語法問題。當我嘗試第二種格式時遇到問題,從數據庫中僅提取User而沒有Group,或者從json對象中添加新的User,則有groupId而不是Group對象。因此,在我再花時間在兩種格式之間來回切換之前,我想知道哪種方式應該使用註釋來最好地符合行業標準?

回答

0

我會嘗試這樣的事情,如果你可以改變列的名字太:

@Entity 
@Table(name = "users") 
public class User { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) //This means you will need the database to generate the ids, if you are using Oracle this won't work. You would need to use SEQUENCE. 
    private Long id; 

    @ManyToOne 
    @JoinColumn(name = "group_id") //There will be no need to specify the join column if you use group_id. 
    private Group group; 

    @Column(name = "name") 
    private String name; 

    ... 
    // getters and setters.... 
} 

@Entity 
@Table(name = "groups") 
public class Group { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    @Column(name="group_name") 
    private String groupName; 

    ... 
    // getters and setters.... 
} 

此外,如果你能我會改變表的名稱多。

此外,我使用的東西,可以幫助我很多。我有所謂的「身份」,它只是有ID的超類,它看起來是這樣的:不過,如果你

@Entity 
@Table(name = "users") 
public class User extends Identifiable { 

    private static final long serialVersionUID = -90275424699375956859L; 

    @ManyToOne 
    @JoinColumn(name = "group_id") //There will be no need to specify the join column if you use group_id. 
    private Group group; 

    @Column(name = "name") 
    private String name; 

    ... 
    // getters and setters.... 
} 

@MappedSuperclass 
public class Identifiable implements Serializable { 

    private static final long serialVersionUID = -9027542469937539859L; 

    @Id 
    @Column(name = "ID") 
    @GeneratedValue 
    private Long id; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((id == null) ? 0 : id.hashCode()); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     Identifiable other = (Identifiable) obj; 
     if (id == null) { 
      return false; 
     } else if (!id.equals(other.id)) 
      return false; 
     return true; 
    } 

} 

有與IDS很容易,你可以擴展所有的類象不能改變名稱,讓我們知道你正在拋出的痕跡的問題,我們可能會提供幫助。

謝謝!

相關問題