Hibernate注解、类级别注解

Hibernate注解简介

使用注解的目的:为了简化繁琐的ORM映射文件(*.hbm)的配置。也就是做注解要做的就是ORM映射文件要做的一切工作,只是在形式上有所区别。

JPA与Hibernate的关系

什么是JPA:全称Java Persistence API。JPA注解是JAVAEE的规范和标准。

JPA和Hibernate的关系:JPA是标准接口,Hibernate是实现,但是其功能是JPA的超集。

Hibernate如何实现与JPA的关系?
通过hibernate-annotation、hibernate-entitymanager和hibernate-core三个组件来实现。
一般在实际开发中,优先考虑使用JPA注解,这样有利于程序的移植和扩展。

Hibernate注解的分类

类级别注解
属性级别注解
映射关系注解

常见的类级别注解:
@Entity,表示的是一个实体类,一个实体类就应该对应数据库当中的一张表
@Table
@Embeddable,表示是一个嵌入类

@Entity

@Entity表示映射的是一个实体类,一个实体类对应数据库中一种表。

用法:
@Entity(name=”tableName”)
name属性表示映射到数据库中的表名。是可选的,如果表名与实体类名相同,就可以省略。
注意:使用@Entity是必须指定实体类的主键属性。

引入Hibernate、mysql、junit的一些包
先创建好一个项目,设置好hibernate.cfg.xml文件

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

    <session-factory>
        <property name="connection.username">root</property>
        <property name="connection.password">12345678</property>
        <property name="connection.driver_class">
            com.mysql.jdbc.Driver
        </property>
        <property name="connection.url">
            jdbc:mysql:///hibernate?useUnicode=true&amp;characterEncoding=UTF-8
        </property>
        <property name="dialect">
            org.hibernate.dialect.MySQLDialect
        </property>

        <property name="show_sql">true</property>
        <property name="format_sql">true</property>
        <property name="hbm2ddl.auto">create</property>
        <property name="hibernate.current_session_context_class">thread</property>
    </session-factory>

</hibernate-configuration>

然后创建一个包,里边写上实体类Students,然后给这个类上边添加一个@Entity注解,这就保证这个类将来可以映射为数据库中的一张表。

import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Students {

    private int sid;
    private String sname;
    private String gender;
    private Date birthday;
    private String major;
    private String address;

    private Students(){

    }

    public Students(int sid, String sname, String gender, Date birthday,
            String major, String address) {
        //super();
        this.sid = sid;
        this.sname = sname;
        this.gender = gender;
        this.birthday = birthday;
        this.major = major;
        this.address = address;
    }

    @Id
    public int getSid() {
        return sid;
    }

    public void setSid(int sid) {
        this.sid = sid;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getMajor() {
        return major;
    }

    public void setMajor(String major) {
        this.major = major;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

其中在getId方法上要加上@Id,表示它是一个主键。

然后就要把这个类添加到配置文档中<mapping class="com.entity.Students"/>

然后要创建测试类

public class TestStudents {

    @Test
    public void testSchemaExport(){
        //用于输出表结构

        //创建配置对象
        Configuration config = new Configuration().configure();
        //创建服务注册对象
        ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
        //创建会话工厂对象
        SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);

        SchemaExport export = new SchemaExport(config);
        export.create(true,true);//生成表结构
    }
}

测试之后就可以看到在数据库中确实创建了这个students表

@Table

@Table(name=”“,catalog=”“,schema=”“)
这个注解一般有三个属性,如上所示
@Table与@Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表的信息。

name:可选,映射表的名称,默认表名与实体名称一致,只有在不一致的情况下才需要指定表名
catalog:可选,表示目录名称,默认为Catalog(“”)
schema:可选,表示模式名称,默认为Schema(“”)

一个数据库可以包含多个Catalog(目录),每一个Catalog又可以有多个Schema(模式)。每一个Schema可以包含多个数据库对象,包括表,视图,字段。
从实现的角度来看,各种数据库系统对Catalog和Schema的支持和实现方式千差万别。MySQL不支持Catalog,Schema为数据库名称。

在之前的例子中,可以在@Entity之后再加上注解@Table(name=”t_students”,schema=”hibernate”)

@Embeddable

@Embeddable表示一个非Entity类可以嵌入到另一个Entity类中作为属性而存在

可以新建一个Address类,里边增加几个字段并且封装。

@Embeddable
public class Address {

    private String postCode;
    private String address;
    private String phone;

    public String getPostCode() {
        return postCode;
    }
    public void setPostCode(String postCode) {
        this.postCode = postCode;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
}

加上@Embeddable表示它是一个嵌入类,在其他类中充当一个属性。

把Students实体中把基本类型的address删掉,新增组件类型的Address
private Address add;
修改构造方法中的参数并且将其封装。

运行测试方法就可以得到一个新的表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值