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; }