Hibernate必知必会——Annotations

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010871004/article/details/81516762

Annotations

对于hibernate的配置,我们通常是采用配置文件的方式来对实体类和数据表建立连接。而hibernate也提供了Annotations来让我们直接在java代码中进行配置,这样我们在开发中就不用一边看配置文件,一边看java代码。

基本注解

  • @Entity

我们需要声明一个实体类让hibernate框架使用,而这个类需要使用@Entity的注解来修饰,hibernate才会把它当做一个持久化类。

  • @Table

实体类是需要和数据表之间建立映射关系的,@Table的修饰,可以让当前的实体类,映射到数据表中。当然这个注解式可选的,也就是说我们可以不用这个注解,不用注解的时候,hibernate会把当前的类名当做表名来映射过去,如果需要自动以表名,则我们需要使用@Table(name=”customTableName”),除了name属性,@Table还提供了uniqueConstraints,schema,catalog,indexes等属性

uniqueConstraints:例如@Table(name = “tbl_employee”, uniqueConstraints =
@UniqueConstraint(columnNames = { “id” , “empCode”})),uniqueConstraints就是为了定义id和empCode一起作为唯一约束存在。

  • @Column

表中是有字段的,而字段是和实体类中的属性相互映射的,建立起这样的映射关系是通过@Column修饰。同样,如果我们需要自定义列名,我们需要@Column(name=”cutomeColumnName”),除了name的属性外,@Column中还定义了其他的属性。

unique:true/false,定义该列是否是唯一,不可重复的
nullable:true/false,定义该列是否可以为空
length:定义该列的长度
scale:如果是浮点数,定义小数点的位数
precision:如果是浮点数,定义浮点数的位数
columnDefinition:可以使用原生的sql定义语句,直接给该列定义属性,例如@Column(columnDefinition = “timestamp NOT NULL DEFAULT
CURRENT_TIMESTAMP”)
insertable:true/false,定义该列是否可以插入
updatable::true/false,更新的时候是否会入数据表

  • @Id
    每一条数据量记录都是由主键的,要不然没有办法找到唯一的一条记录。所以@Id来修饰主键。而hibernate中定义了四种主键的生成策略:GenerationType.AUTO,GenerationType.TABLE,GenerationType.SEQUENCE,GenerationType.IDENTITY。而其中GenerationType.AUTO是默认的主键生成方式。

GenerationType.AUTO:

@Id
@GeneratedValue
private long id;

GenerationType.SEQUENCE;

@Id
@SequenceGenerator(name="seq", sequenceName="DB_SEQ")
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq")
private long id;

GenerationType.TABLE:

@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.TABLE, generator =
"gen_tbl")
@TableGenerator(name = "gen_tbl", table = "gen_table", pkColumnName
= "pk", valueColumnName = "id", pkColumnValue = "employee0",
initialValue = 0, allocationSize = 1)
private long id;

GenerationType.IDENTITY:

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

代码演示

package com.hibernate.pojo;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "om_order")
public class Order{

    @Id
    @Column(name = "order_id")
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long orderId;
    @Column(name = "service_number", nullable = false)
    private String serviceNumber;
    @Column(name = "create_time",columnDefinition = "timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP")
    private Date createTime;
    @Column(name = "remark",insertable=false)
    private String remark;


    public Order() {
        super();
    }

    public Order(String serviceNumber, Date createTime, String remark) {
        super();
        this.serviceNumber = serviceNumber;
        this.createTime = createTime;
        this.remark = remark;
    }

    public Long getOrderId() {
        return orderId;
    }

    public void setOrderId(Long orderId) {
        this.orderId = orderId;
    }

    public String getServiceNumber() {
        return serviceNumber;
    }

    public void setServiceNumber(String serviceNumber) {
        this.serviceNumber = serviceNumber;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    @Override
    public String toString() {
        return "Order [orderId=" + orderId + ", serviceNumber=" + serviceNumber + ", createTime=" + createTime
                + ", remark=" + remark + "]";
    }


}
package com.hibernate.application;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import com.hibernate.pojo.Order;
import com.hibernate.util.HibernateUtil;

public class App7 {

    public static void main(String[] args) {
        new App7().testInsertable();;
    }

    /**
     * 利用annotation注解,正常插入数据
     */
    public void testNormalSaveObject() {
        SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
        Session session = sessionFactory.openSession();
        session.getTransaction().begin();
        Order order = new Order("17852827092", new Date(), "This is test");
        session.save(order);
        session.getTransaction().commit();
        session.close();
        HibernateUtil.closeSessionFactory();
    }

    /**
     * 测试注解insertable=false
     */
    public void testInsertable() {
        SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
        Session session = sessionFactory.openSession();
        session.getTransaction().begin();
        Order order = new Order("17852827092", new Date(), "This is test");
        session.save(order);
        session.getTransaction().commit();
        session.close();
        HibernateUtil.closeSessionFactory();
    }
}

利用注解的时候,我们需要将hibernate的配置文件,hibernate.cfg.xml中的实体类引入到hibernate中

<mapping class="com.hibernate.pojo.Order"/>

猜你喜欢

转载自blog.csdn.net/u010871004/article/details/81516762