Hibernate注解,在开发中很重要,它的好处不止是简化了系统开发,而且使得持久层之间的关系更加的清晰。本文一共分三个部分这三个部分所有的注解都是Hibernate开发常用的注解以及这些注解的重要的属性,希望各位读完有所收获,本人的开发水平有限,如在阅读的时候发现不正之处敬请指正和谅解!
我将从最简单的web项目开始一步一步往下深入:
一.建立web项目
创建web项目时需要注意的问题:
1.JavaEE_Version的选择:
然后点击Next后再点击Next一次会出现如下问题:有的项目建立好后会发现没有web.xml这是因为没有勾选下图中红线上的部分,当然这里我们暂时不需要web.xml.
最后点击Finish就可以了,至此web Poject 就创建好了。
创建好的web Poject 如下图:读者如果建立好的web Poject 和我的不同,主要表现在读者没有Java EE 7 Libraries这个文件夹,你们是Java EE 7.0Generic Library,而我没有这个目录。原因于在上边我说的那个可能会抛出的异常:Exception in thread "main" java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index; 这是我个人的原因造成的,我把我造成这个异常的原因给大家分享一下,希望大家以后不要再遇上这种情况:
我在向WebRoot 中的lib 目录下加载HIbernate的核心jar包的时候我加入的是4.3的版本;而我在建立项目的时候选择的是JavaEE6.0的版本。在所有的代码编写完成以后我开始写main方法进行测试,结果就报了这个异常。看到这个主异常报找不到方法的情况后,我首先想到是不是代码写错了还是代码中的包导错了,花了两三分钟的时间把代码看完后,没有什么问题。接着我又想是不是jar包加错了,看后没有问题。最后开始查资料但上面说可能是:model中使用了@Table(name="xxx")这个注解所致,于是推荐的改法是将这个标签去掉,改用@Entity(name="xxx")这个注解,甚至有人说是新版的hibernate不支持@Table这个注解了。没办法去参看HIbernate的官方文档:在Hibernate的新官方文档中,明确提到了@Table这个注解:@Table lets you define the table the entity will be persisted into. If undefined, the table name is the unqualified class name of the entity.这就把不支持的就推倒了,接着把@Entity和@Table中的name属性按照资料中的说法进行了替换,结果依然不可以。然后我就把以前的web poject 的项目打开看了一下,发现JavaEE的版本和以前的对不上(以前的都是JavaEE7.0的版本)这次是JavaEE6.0的版本。看到这我的心里有点小喜庆,果断的把JavaEE6.0版本里面的三个jar包删除。当然里面的jar包一删除Java EE 6.0Generic Library,这个也没有了,于是我又重新建立了一个Java EE 7 Libraries的一个文件夹,把7.0版本所在的这三个jar包重新copy了进去,然后Bpath一下就好了,再进行测试就成功的在数据库中建立了表格并且在里面添加了一条数据。
然后我们在src的目录下建立一个两个package并把hibernate.cfg.xml核心配置进行创建,如下图:
然后在这两个包中分别添加两个类。在pojo中添加实体bean,在TestClass中添加测试方法,如下图:
hibernate.cfg.xml中没有添加别的就添加了关于链接数据库的一个配置和tdt约束,和一个需要映射到pojo中那个实体bean中的<mapping>;
在WebRoot中的lib下的目录下加入的jar包,如下图:
下面就是pojo中的代码了:
package com.bd.cdw.pojo;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
/**
* 测试Hibernate注解开发(第一部分)
* Hibernate注解开发的优点:
* 作为Java开发程序员来说,在进行SSH开发的时候常常在实体类中要写hibernate.hbm.xml
* 这样做不是不可以但太麻烦,所以今天就以初学者的心态来看一下,用hibernate的注解进行开
* 发是如何的方便.
* 备注:在用hibernate的注解开发后不需要再写hibernate.hbm.xml,当程序运行时会自动
* 在数据库中进行建立所对应的表格,由于hibernate的注解太多而且每个注解的属性有很多,所以
* 这里就不一一列举,只把在开发中常用的注解和对应的属性一一做个介绍(分三部分介绍)。
*
* 学习和测试的环境:
* 1.IDE:Myeclipse14
* 2.J2EE:JavaEE7.0
* 3.JDK_Version:1.7
*
* 说明:针对对象属性的注解可以加到属性上面,也可以加到私有化属性所在的get方法上面
* 个人认为加到get方法上面较好,理由是加到私有化属性上面的话破坏对象私有化属性的
* 安全性。
*/
/**
* @Entity(必须)
* 作用:将一个类声明为一个实体bean。
* 属性:
* name(非必须):对应数据库中的一个表。若表名与实体类名相同,则可以省略。如:@Entity(name="t_HibernateAnnotation")
*
* @Table(非必须,但最好写上和@Entity配套使用)
* 作用:只能标注在实体的 class 定义处,表示实体对应的数据库表的信息。
* 属性:
* name(非必须):表示表的名称,默认地,表名和实体名称一致,只有在不一致的情况下才需要指定表名
* uniqueConstraints(非必须),指定表中那些字段需要进行唯一性约束;
* catalog(非必须):指定生成的表在哪个数据库实例中,默认为在配置文件中URL指定的数据库.
*/
@Entity
@Table(name="t_HibernateAnnotation",uniqueConstraints={@UniqueConstraint(columnNames="mobile")})
public class HibernateAnnotation implements Serializable
{
private static final long serialVersionUID = -8196034264537331950L;
//用户的ID
private Integer uid;
//用户的姓名
private String username;
//用户的密码
private String password;
//用户的电话号码
private String mobile;
//生成无参的构造器
public HibernateAnnotation()
{
super();
}
//生成有参的构造器
public HibernateAnnotation(Integer uid,String username,String password,String mobile)
{
super();
this.uid=uid;
this.username=username;
this.password=password;
this.mobile=mobile;
}
//生成get和set方法
/**
* @Id
* 作用: 给实体的一个属性标识为数据库表中的主键
*
* @GeneratedValue(Sequence序列,Generated产生)
* 作用: 指定主键的生成策略,和@Id配合使用
* 属性:
* generator:生成器的名称。
* strategy:生成策略,有四种:AUTO、IDENTITY、SEQUENCE、TABLE。
* 指定主键的生成策略
* GenerationType.AUTO:主键由程序自动的控制,既:这个策略是根据数据库的底层自动选择IDENTITY、SEQUENCE、TABLE。;
* GenerationType.TABLE:需要注意的是,IDENTITY、SEQUENCE、TABLE生成的id是整形类型(short、int、long)。
* IDENTITY适用于MySQL、Sql Server等数据库。用此策略时,省略 generator属性。
* GenerationType.IDENTITY:主键由数据库自动生成(主要是自动增长型),如果插入的数据相同时则不会插入(Oracle数据库不支持)
* GenerationType.SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列(MySql不支持)。
* 适用于Oracle,需要用 @SequenceGenerator。
* 主要属性:
* name:生成器的名称,对应@GeneratedValue的generator属性。
* sequenceName:数据库中sequence的名称。
* initialValue:sequence的初始化值。
* allocationSize:sequence的大小。
* 如:
* @Id
* @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq")
* @SequenceGenerator(name = "seq", sequenceName = "seq_stu", initialValue = 3, allocationSize = 10)
* public Integer getId()
* {
* return id;
* }
*
*
*/
//指定主键
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
/**
* @Column
* 作用:指定数据库中对应字段的属性
* 属性:
* name:默认的是和实体类所对应的属性名一致,也可以自定义
* unique:该字段是否具有唯一性约束
* length:该字段的长度
* nullable:该字段的数据是否可以为空
* insertable:是否允许插入
* updatetable:是否允许更新
* table:从表名。如果此列不建在主表上(默认是主表),该属性定义该列所在从表的名字
*/
@Column(unique=false,length=30,nullable=false)
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Column(unique=false,length=30,nullable=false)
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Column(unique=true,length=20,nullable=false)
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
//生成toString方法
@Override
public String toString() {
return "HibernateAnnotation [uid=" + uid + ", username=" + username
+ ", password=" + password + ", mobile=" + mobile + "]";
}
}
下面就是测试类的代码,测试类的代码里基本没有写注释请大家谅解:
package com.bd.cdw.TestClass;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import com.bd.cdw.pojo.HibernateAnnotation;
/**
*
*<p>Title:测试hibernate注解的映射表关系</p>
*<p>Description:</p>
*<p>Company:www.bd.com</p>
*
* @author 陈大伟
* @date 2017年5月8日上午10:43:39
* @version 1.4
*/
public class TestHibernatePojoAnnotationMapper
{
public static void main(String[] args)
{
Configuration configuration=null;
ServiceRegistry serviceRegistry=null;
SessionFactory sessionFactory=null;
Session session=null;
try {
configuration=new Configuration().configure();
serviceRegistry=
new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
sessionFactory=configuration.buildSessionFactory(serviceRegistry);
session=sessionFactory.openSession();
session.beginTransaction();
HibernateAnnotation hibernateAnnotation=new HibernateAnnotation(null,"陈卫国","112233445566","123456788");
session.save(hibernateAnnotation);
session.getTransaction().commit();
session.close();
} catch (Exception e) {
e.getMessage();
}
finally
{
session.close();
sessionFactory.close();
}
}
}
上面就是关于Hibernate注解开发的第一部分,还有两个部分是关于嵌入式注解和表与表之间关系映射的注解。