1、@Column注解
就像@Table注解用來標識實體類與數據表的對應關系類似,@Column注解來標識實體類中屬性與數據表中字段的對應關系。
@Column注解一共有10個屬性,這10個屬性均為可選屬性,各屬性含義分別如下:
name
name屬性定義了被標注字段在數據庫表中所對應字段的名稱;
unique
unique屬性表示該字段是否為唯一標識,默認為false。如果表中有一個字段需要唯一標識,則既可以使用該標記,也可以使用@Table標記中的@UniqueConstraint。
nullable
nullable屬性表示該字段是否可以為null值,默認為true。
insertable
insertable屬性表示在使用“INSERT”腳本插入數據時,是否需要插入該字段的值。
updatable
updatable屬性表示在使用“UPDATE”腳本插入數據時,是否需要更新該字段的值。insertable和updatable屬性一般多用於只讀的屬性,例如主鍵和外鍵等。這些字段的值通常是自動生成的。
columnDefinition
columnDefinition屬性表示創建表時,該字段創建的SQL語句,一般用於通過Entity生成表定義時使用。(也就是說,如果DB中表已經建好,該屬性沒有必要使用。)
table
table屬性定義了包含當前字段的表名。
length
length屬性表示字段的長度,當字段的類型為varchar時,該屬性才有效,默認為255個字符。
precision和scale
precision屬性和scale屬性表示精度,當字段類型為double時,precision表示數值的總長度,scale表示小數點所占的位數。
此標記可以標注在getter方法或屬性前,例如以下的兩種標注方法都是正確的
2、@JoinColumn
與@Column相區別的是:@JoinColumn注釋的是保存表與表之間關系的字段,它要標注在實體屬性上。而@Column標注的是表中不包含表關系的字段。
與@Column標記一樣,name屬性是用來標識表中所對應的字段的名稱。例如customer表中存在字段addr_id,標識的代碼如下所示。
@OneToOne
@JoinColumn(name = "addr_id")
public AddressEO getAddress() {
return address;
}
若此時,不設置name的值,則在默認情況下,name的取值遵循以下規則:
name=關聯表的名稱+“_”+ 關聯表主鍵的字段名
例如,CustomerEO實體中,如果不指定name的值,默認將對應name=address_id;因為@JoinColumn注釋在實體 AddressEO屬性上,實體AddressEO對應的表名為“address”;表address的主鍵是“id”,所以此時對應的默認的字段名稱為 “address_id”。
3、@ManyToOne
從具體用戶Users查到其對應的Group,反過來也能通過Group查到具體Users,所以是雙向關聯,所以Group對於Users是“一對多”的關聯關系@OneToMany,Users對於Group是“多對一”@ManyToOne。
@Entity @Table(name="t_Group")//指定一個表名 public class Group { private int id; private String name; private Set<Users> users = new HashSet<Users>(); @Id @GeneratedValue//主鍵用自增序列 public int getId() { return id; } @OneToMany(mappedBy="group",cascade=(CascadeType.ALL))//以“多”一方為主導管理,級聯用ALL public Set<Users> getUsers() { return users; }
@Entity @Table(name="t_Users") public class Users { private int id; private String name; private Group group; @Id @GeneratedValue public int getId() { return id; } @ManyToOne(fetch=FetchType.LAZY,cascade=(CascadeType.ALL))//解決1+N,級聯用ALL @JoinColumn(name="groupId")//指定外鍵名稱,不指定的默認值是group_Id public Group getGroup() { return group; }