Hibernate注解使用
日期:2014-02-25点击次数:7409
在这里介绍下Hibernate注解的简单使用以及自己在使用过程中的一些例子。
在Hibernate中每一个会持久化到数据库的类,都是一个实体Bean我们可以使用@Entity以及@Table注解来声明该实体Bean,并声明该实体Bean对应的数据库表名。同时每一个实体Bean必须要使用@Id注解来声明该实体Bean的主键(该声明是必不可少的)。例子如下:
@Entity
@Table( name = "T_ENTITY" )
public class AbstractEntity implements Serializable
{
@Id
@Column ( name = "ID" )
@GeneratedValue ( generator = "uuid" )
@GenericGenerator ( name = "uuid", strategy = "uuid2" )
private String id;
@Column ( name = "NAME", columnDefinition = "varchar(50) comment '服务名称'" )
private String name;
@Transient
private int cpuUsagePcnt;
public String getId()
{
return id;
}
public void setId( String id )
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName( String name )
{
this.name = name;
}
public int getCpuUsagePcnt()
{
return cpuUsagePcnt;
}
public void setCpuUsagePcnt( int cpuUsagePcnt )
{
this.cpuUsagePcnt = cpuUsagePcnt;
}
}
在上面的例子中,我们还能看到@Column注解,该注解是用来将实体Bean的属性映射到数据库表的某个字段上。在该注解拥有以下属性:name(string): 列名; unique(boolean):是否在该列上设置唯一约束;nullable(boolean):该列是否可空;columnDefinition(string):该列的备注,我们可以在这里声明该列的数据类型以及comment信息;length:该列的长度。
@GeneratedValue和@GenericGenerator说明了该实体Bean的主键生成策略。@Transient注解说明了该属性是一个暂态的属性,不会进行持久化。
下面来说下使用注解来配置类于类之间的映射关系,如:一对多,多对多,一对一。
@Entity
@Table ( name = "T_ALM_HANDL_RULE_SET" )
public class AlarmEventHandleRuleSet extends AbstractEntity
{
@ManyToMany
@JoinTable (
name = "T_M_ALM_HANDL_RULE_SET_RULE",
joinColumns = @JoinColumn ( name = "RULE_SET_ID" ),
inverseJoinColumns = @JoinColumn ( name = "RULE_ID" ) )
private Set<AlarmEventHandleRule> rules;
@ManyToOne ( fetch = FetchType.LAZY )
@JoinColumn ( name = "ORG_ID" )
private Org org;
public String getName()
{
return name;
}
public void setName( String name )
{
this.name = name;
}
public Set<AlarmEventHandleRule> getRules()
{
return rules;
}
public void setRules( Set<AlarmEventHandleRule> rules )
{
this.rules = rules;
}
public Org getOrg()
{
return org;
}
public void setOrg( Org org )
{
this.org = org;
}
}
@Entity
@Table ( name = "T_ALM_HANDL_RULE" )
public class AlarmEventHandleRule extends AbstractEntity
{
@OneToOne ( orphanRemoval = true, cascade = CascadeType.ALL )
@JoinColumn ( name = "GRADE_RULE_ID", columnDefinition = "varchar(36) comment '所关联规则'" )
private AlarmLevelGradeRule gradeRule;
@OneToMany ( cascade = CascadeType.ALL )
@JoinColumn ( name = "RULE_ID", columnDefinition = "varchar(36) comment '关联处理规则'" )
private List<AbstractAlarmEventHandler> handlers;
public List<AbstractAlarmEventHandler> getHandlers()
{
return handlers;
}
public void setHandlers( List<AbstractAlarmEventHandler> handlers )
{
this.handlers = handlers;
}
public AlarmLevelGradeRule getGradeRule()
{
return gradeRule;
}
public void setGradeRule( AlarmLevelGradeRule gradeRule )
{
this.gradeRule = gradeRule;
}
}
在上面的例子中,我们可以看到这两个类中所使用的用来标示关联关系的注解。
@ManyToMany用来标示多对多的关系,同时通过 @JoinTable 注解描述关联表和关联条件。其中一端定义为 joinColumns, 另一端定义为 inverseJoinColumns (对关联表进行更新操作,这端被忽略)。
@ManyToOne用来标示多对一的关系,同时可以通过@JoinColumn注解描述关联字段。若想要配置双向关联则需要再一的一方相关使用使用 @OneToMany(mappedBy=“一的一方的属性来”来实现双向的关联关系。
@OneToOne用来标示一对一的关系,一对一关系又分为3中情况:关联的实体共享相同的主键使用@PrimaryKeyJoinColumn注解来声明;一个实体通过外键关联到另一个实体的主键使用@JoinColumn(name="xxx_fk")来声明;通过关联表来保存两个实体之间的关联关系使用@JoinTable(name = "x",joinColumns = @JoinColumn(name="x_fk"),inverseJoinColumns = @JoinColumn(name="x_fk"))来声明。
软件部 李冰