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"/>