Hibernate---数据操作示例BY实体类注释

Posted H小白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate---数据操作示例BY实体类注释相关的知识,希望对你有一定的参考价值。

通过实体的映射文件创建表的示例,除了基本jar包外,还需要jar包如下

ejb3-persistence.jar、hibernate-annotations.jar这两个包均在hibernate-annotations压缩文件下

下载,密码:o30j;官网下载:https://sourceforge.net/,搜索Hibernate,选择Hibernate,点击Files,选择需要的依赖jar包(hibernate-annotations);基本jar包下载可阅读Hibernate---开发环境搭建文章;

例子

创建一个Student.java实体注释类:该类需要一个无参的构造函数,以及属性的get/set方法,而其中的注释导入的则是javax.persistence.*包。具体注释简介见Hibernate---实例类注释。

@Entity
@DynamicInsert(true)
@DynamicUpdate(true)
@Table(name = "students")
public class Students implements Serializable {

    private static final long serialVersionUID = 2257468553009291835L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private int id;
    
    @Column(name="name",columnDefinition="varchar(50) default \'\'" )//需要设置默认值,default中的\'\'不能忽略,并且必须指定数据类型值。特别提示,不能有nullable=false设置
    private String name;
    
    @Column(name="age",nullable=false)
    private int age;
public Students() { }
    
    public Students(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    
}

@DynamicInsert(true) @DynamicUpdate(true)这两个类注释用于动态生成sql语句,即优化sql代码,提高执行sql效率。默认值为false

举例说明:

添加对象时

没有设置@DynamicInsert(true),如果该例子中添加的student对象没有name值,SQL语句仍然是insert into students (age, name)  values (?, ?),并且保存到数据库中的student记录没有保存name默认值。

若设置@DynamicInsert(true)如果该例子中添加的student对象没有name值,那么SQL语句则是insert into students (age)  values (?),并且保存到数据库中的student记录保存了name默认值。

修改对象时

没有设置 @DynamicUpdate(true),如果该例子中只修改了student对象的name值,SQL语句仍然是update students set name=?, age=? where id = ?;

若设置 @DynamicUpdate(true)如果该例子中只修改了student对象的name值,那么SQL语句则是update students set name=? where id = ?;

特别注意:@DynamicInsert添加记录时,设置了default="\' \'默认值的字段(属性)不能设置nullable=false非空属性。nullable=false则表示该字段不能为空,在运行时,@DynamicInsert不生效,非空字段为空,会报错。

配置Hibernate配置文件hibernate.cfg.xml(数据库连接信息),将该文件放到src目录下。注意,与实体注释类关联的mapping标签属性是class

复制代码
<!-- ~ Hibernate, Relational Persistence for Idiomatic Java ~ ~ License: 
    GNU Lesser General Public License (LGPL), version 2.1 or later. ~ See the 
    lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. -->
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <!-- 配置数据库的方言 -->
        <property name="hibernate.dialect">org.hibernate.dialect.mysql5InnoDBDialect</property>
        <!-- 驱动程序名 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <!-- 数据库名称 -->
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernateTest</property>
        <!-- 用户名 -->
        <property name="hibernate.connection.username">root</property>
        <!-- 密码 -->
        <property name="hibernate.connection.password">123456</property>

        <!-- 显示SQL语句 -->
        <property name="show_sql">true</property>
        <!-- 格式化输出SQL语句 -->
        <property name="format_sql">true</property>
        
        <property name="hbm2ddl.auto">create</property><!-- 在实际情况中,该值应为update -->
        <!-- 与实体注释类关联 -->
        <mapping class="com.hibernate.study.entity.Students" />
        
    </session-factory>
</hibernate-configuration>
复制代码

一个测试类

复制代码
public class StudyTest {

    private static SessionFactory sessionFactory; // 会话工厂对象
    private static Session session;
    private static Transaction transcction;

    public static void main(String[] args) {
        // 创建配置对象
        Configuration config = new Configuration().configure();
        // 创建会话工厂对象
        sessionFactory = config.buildSessionFactory();
        // 会话对象
        session = sessionFactory.openSession();
        // 开启事务
        transcction = session.beginTransaction();
        // 生成学生对象
        Student stu = new Student("疾风剑豪", 10);
        session.save(stu); // 保存对象到数据库
        transcction.commit(); // 提交事务
        session.close(); // 关闭会话
        sessionFactory.close(); // 关闭会话工厂
    }

}
复制代码

至此还需要一个log4j.properties配置文件

以上是关于Hibernate---数据操作示例BY实体类注释的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate 使用注释

拥有复杂的实体类有啥意义(在 Hibernate 意义上)

[ SSH框架 ] Hibernate框架学习之四(JPA)

Hibernate 实体类不接

从 JPA 注释的实体类自动生成数据模式

hibernate 注释说明