Hibernate注解使用

日期:2014-02-25点击次数:8720

       在这里介绍下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"))来声明。


 

软件部   李冰

姓名:
性别:
电话:
E-mail
问题:
问题描述: