Hibernate 注解(Hibernate Annotation) 是一种比较新的方式,通过在 java 简单类增加注解,来声明 java 类和数据库表的映射,作用和 xml 文件相似。hibernate 注解可以用来增强,或者替换 xml 的映射声明方式。

hibernate 注解功能需要使用下面三个 jar 文件

hibernate-annotations.jar

ejb3-persistence.jar

hibernate-commons-annotations.jar

代码的目录结构如下:

hibernate.cfg.xml 存储数据库信息,如数据库类型,账号密码,数据库名称。

Employee.java Employee 实体类,包含注解,声明 java 类和数据库表结构的映射关系。

ManageEmployee.java 管理 Employee,并对外提供操作 Employee 对象数据的接口。

App.java,演示本例子。

代码详情

在数据库中,创建 EMPLOYEE 表结构

create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);

创建 java 简单类,含有注解。

@Entity 表明 Employee 类似一个实体类( Entity Bean ),并且有一个无参构造函数

@Table 声明用于持久化当前类( Employee ) 的数据库表名。

@Id,每一个实体类都有一个主键,用 @Id 声明

@Column,表明当前变量所映射的数据库表的字段

package tony.hibernateAnnotation;

import javax.persistence.*;

@Entity
@Table(name="EMPLOYEE")
public class Employee {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id; @Column(name = "first_name")
private String firstName; @Column(name = "last_name")
private String lastName; @Column(name = "salary")
private int salary; public Employee() {}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName( String first_name ) {
this.firstName = first_name;
}
public String getLastName() {
return lastName;
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
public int getSalary() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
}

ManageEmployee.java Employee 的操作工具类。对业务层提供操作 Employee 的接口。

package tony.hibernateAnnotation;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration; public class ManageEmployee { private static SessionFactory factory;
{
factory = new Configuration().configure()
.addPackage("tony.hibernateAnnotation")
.addAnnotatedClass(Employee.class)
.buildSessionFactory();
} public int addEmployee(String fname, String lname, int salary){
Session session = factory.openSession();
Transaction tx = null;
Integer employeeID = null;
try{
tx = session.beginTransaction();
Employee employee = new Employee();
employee.setFirstName(fname);
employee.setLastName(lname);
employee.setSalary(salary); employeeID = (Integer) session.save(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
return employeeID;
} public void listEmployees(){
Session session = factory.openSession();
Transaction tx = null;
tx = session.beginTransaction();
List<Employee> employees = session.createQuery("FROM Employee").list();
for(Employee emp : employees){
System.out.println(emp.getId() + ", " + emp.getFirstName() + ", " + emp.getLastName() + ", " + emp.getSalary());;
}
tx.commit();
session.close();
} public List<Employee> getAllEmployees(){
Session session = factory.openSession();
Transaction tx = null;
tx = session.beginTransaction();
List<Employee> employees = session.createQuery("FROM Employee").list();
tx.commit();
session.close();
return employees;
} public void updateEmployee(int employeeId, int salary){
Session session = factory.openSession();
Transaction tx = null; tx = session.beginTransaction();
Employee emp = session.get(Employee.class, employeeId);
emp.setSalary(salary);
session.update(emp);
tx.commit();
session.close();
} public void deleteEmployee(int employeeId){
Session session = factory.openSession();
Transaction tx = null; tx = session.beginTransaction();
Employee emp = session.get(Employee.class, employeeId);
session.delete(emp);
tx.commit();
session.close();
}
}

pom.xml 本例子所依赖的包

        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.3.Final</version>
</dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency> <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-annotations -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.5.6-Final</version>
</dependency> <!-- https://mvnrepository.com/artifact/org.hibernate/ejb3-persistence -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>ejb3-persistence</artifactId>
<version>3.3.2.Beta1</version>
</dependency> <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-commons-annotations -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-commons-annotations</artifactId>
<version>3.2.0.Final</version>
</dependency>

说明

根据 tutorialspoint 例子的代码,无法运行成功,可能与 hibernate 使用版本有关,修正下面错误后,运作正常。

运行错误 1

java.lang.NoClassDefFoundError: org/hibernate/cfg/Mappings

在ManageEmployee.java 中,创建 SessionFactory 对象时,应该使用 org.hibernate.cfg.Configuration,而不是用 org.hibernate.cfg.AnnotationConfiguration。参考 java.lang.NoClassDefFoundError, stackOverflow

运行错误2

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'hibernatetest.hibernate_sequence' doesn't exist

这应该和 hibernate 版本有关,在 hibernate 5 及以上版本,在 java 文件中定义主键字段时,使用 @GeneratedValue(strategy = GenerationType.IDENTITY) 代替 @GeneratedValue。参考 Hibernate-sequence doesn't exist, stackOverflow

参考资料

Hibernate - Annotations, tutorialspoint

[Hibernate] 注解映射例子的更多相关文章

  1. Hibernate注解映射sequence时出现无序增长问题+hibernate 映射 oracle ID自动增长:

    Hibernate注解映射sequence时出现无序增长问题+hibernate 映射 oracle ID自动增长: 通过Hibernate注解的方式映射oracel数据库的sequence主键生成器 ...

  2. Hibernate注解映射联合主键的三种主要方式

    今天在做项目的时候,一个中间表没有主键,所有在创建实体的时候也未加组件,结果报以下错误: org.springframework.beans.factory.BeanCreationException ...

  3. [Hibernate] List 映射例子

    List 是 java 集合的一个工具,存储线性的数据,允许重复数据.开发者可以准确控制在 list 那个位置插入数据.本例子演示 Java 的 List 集合和 MySQL 数据库的映射应用. 使用 ...

  4. Hibernate 注解映射

    工作中遇到hibernate映射的一些问题,这里总结一下 (特别是测试时,许多数据并不能有效关联.所以@NotFound 很重要) 一,假设有2张表user,company 我们知道,一个用户属于一个 ...

  5. hibernate -- 注解映射实体和表

    表名的映射 //代表此类参与ORM映射,此注解必须要有 @Entity //代表user这个类映射了一个表user50,如果表名和类名一样,此注解可以省略 @Table(name="user ...

  6. 联合主键用Hibernate注解映射的三种方式

    第一.将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,再将该类注解为@Embeddable,最后在主类中(该类不包含联合主 ...

  7. Hibernate注解----关联映射注解以及课程总结详解----图片版本

    上一篇,记录了Hibernate注解----类级别注解以及属性注解详解 ,我们这一节主要讲解的是Hibernate注解----关联映射注解以及课程总结详解. 本节的主要内容: 第3章 关联映射注解 3 ...

  8. hibernate之映射文件VS映射注解

    前言 对于java开发者而言,注解应该不是一个陌生的概念,早在JavaSE阶段,例如@Override标记重写父类方法或实现接口方法,@Test标记单元测试方法,所以我们可以简单地把它理解为一种有特殊 ...

  9. Hibernate框架学习之注解映射实体类

         前面的相关文章中,我们已经介绍了使用XML配置文件映射实体类及其各种类型的属性的相关知识.然而不论是时代的潮流还是臃肿繁杂的配置代码告诉我们,注解配置才是更人性化的设计,于是学习了基本的映射 ...

随机推荐

  1. $(obj).data() 绑定和获取数据的应用

    1.解说 data() 方法向被选元素附加数据,或者从被选元素获取数据. 例如:$("#id").data("name","xiao"); ...

  2. iOS支付总结

    内容大纲: 一.常见的支付方案简介 二.第三方支付SDK 三.苹果官方支付方案 四.Web支付方案 正文: 一.常见的支付方案简介 在微信支付中 微信支付的网址是: https://pay.weixi ...

  3. PL/SQL常见设置--Kevin的专栏

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  4. 图像载入 imread()[OpenCV 笔记4]

    Mat imread( ); filename 载入的图像名: flags 指定加载图像的颜色类型,默认载入三通道彩色图像, 如果取枚举类型 (OpenCV3中暂时失效),则定义如下 enum{ CV ...

  5. ava下static关键字用法详解

    Java下static关键字用法详解 本文章介绍了java下static关键字的用法,大部分内容摘自原作者,在此学习并分享给大家. Static关键字可以修饰什么? 从以下测试可以看出, static ...

  6. 结合使用 Oracle Database 11g 和 Python

    结合使用 Oracle Database 11g 和 Python 本教程介绍如何结合使用 Python 和 Oracle Database 11g. 所需时间 大约 1 个小时 概述 Python ...

  7. 2016多校联合训练contest4 1012Bubble Sort

    Bubble Sort Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tota ...

  8. ios 复制黏贴板的使用

    在iOS中,可以使用剪贴板实现应用程序之中以及应用程序之间实现数据的共享.比如你可以从iPhone QQ复制一个url,然后粘贴到safari浏览器中查看这个链接的内容. 一.在iOS中下面三个控件, ...

  9. log4j源码阅读

    基于log4j1.2.17的源代码阅读 org.apache.log4j.xml.DOMConfigurator 类是log4j的xml配置文件初始化类 org.apache.log4j.Proper ...

  10. http server v0.1_http_reponse.c

    #include <string.h> #include <sys/stat.h> #include <sys/mman.h> #include <fcntl ...