Hiberate基础用法实例

下面通过一个实际的列子来展示Hibernate的基本用法。

实例:

package com.ydoing.domain;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.persistence.Basic;
import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.MapKeyClass;
import javax.persistence.MapKeyColumn;
import javax.persistence.OrderColumn;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import org.hibernate.annotations.Formula;

@Entity
@Table(name = "person")
public class Person {

    // 主键为ID,最好设置为包装类型Integer
    @Id
    @Column(name = "person_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    // 指定字符长度
    @Column(name = "name", length = 50, nullable = false)
    private String name;

    @Column(name = "age")
    private int age;

    // 也可以不指定列名,默认为类的属性名
    @Column
    private String sex;

    // @Transient表示不用持久化
    @Transient
    private String alias;

    // @Lob表示大数据类型,FetchType.LAZY表示延迟加载,减少性能开销
    @Lob
    @Basic(fetch = FetchType.LAZY)
    private byte[] image;

    // 指定为日期类型
    @Temporal(TemporalType.DATE)
    private Date birthdate;

    // 属性动态生成
    @Formula("(select concat(p.name, p.age, p.sex) from person p where p.person_id = person_id)")
    private String profile;

    // List集合类型
    // 需要显示初始化集合的类型
    @ElementCollection(targetClass = String.class)
    @CollectionTable(name = "pet_inf",// 指定表名
    // 用于映射外键
    joinColumns = @JoinColumn(name = "person_id", nullable = false))
    @Column(name = "pet_name")
    @OrderColumn(name = "list_order")
    private List<String> pets = new ArrayList<>();

    // 数组属性
    @ElementCollection(targetClass = String.class)
    @CollectionTable(name = "school_inf", joinColumns = @JoinColumn(name = "person_id", nullable = false))
    @Column(name = "school_name")
    @OrderColumn(name = "array_order")
    private String[] schools;

    // Set集合属性,Set是无序的,不可重复的,因此Set集合属性无须使用@OrderColumn注解映射集合的索引列
    @ElementCollection(targetClass = String.class)
    @CollectionTable(name = "car_inf", joinColumns = @JoinColumn(name = "person_id", nullable = false))
    @Column(name = "car_name")
    private Set<String> cars = new HashSet<>();// 必须指定接口实现类

    // Map集合属性
    @ElementCollection(targetClass = Float.class)
    @CollectionTable(name = "salary_inf", joinColumns = @JoinColumn(name = "person_id", nullable = false))
    // 指定key的类型
    @MapKeyColumn(name = "salary_type")
    @MapKeyClass(String.class)
    // 映射Map的value
    @Column(name = "money")
    private Map<String, Float> payroll = new HashMap<>(); // 必须指定接口实现类

    // 映射组件属性,所谓组件的意思是:不是基本数据类型,而是自定义的复合类型,且不是持久化实体
    private Address address;

    public Address getAddress() {
        return address;
    }

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

    public Map<String, Float> getPayroll() {
        return payroll;
    }

    public void setPayroll(Map<String, Float> payroll) {
        this.payroll = payroll;
    }

    public String[] getSchools() {
        return schools;
    }

    public void setSchools(String[] schools) {
        this.schools = schools;
    }

    public String getSex() {
        return sex;
    }

    public Set<String> getCars() {
        return cars;
    }

    public void setCars(Set<String> cars) {
        this.cars = cars;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getProfile() {
        return profile;
    }

    public void setProfile(String profile) {
        this.profile = profile;
    }

    public Person() {
    }

    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;
    }

    public String getAlias() {
        return alias;
    }

    public void setAlias(String alias) {
        this.alias = alias;
    }

    public byte[] getImage() {
        return image;
    }

    public void setImage(byte[] image) {
        this.image = image;
    }

    public Date getBirthdate() {
        return birthdate;
    }

    public void setBirthdate(Date birthdate) {
        this.birthdate = birthdate;
    }

    public List<String> getPets() {
        return pets;
    }

    public void setPets(List<String> pets) {
        this.pets = pets;
    }

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

}

组件类

package com.ydoing.domain;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import org.hibernate.annotations.Parent;
@Embeddable
public class Address {
    @Column(name = "person_province")
    private String province;
    @Column(name = "person_city")
    private String city;
    public Address() {
    }
    // 属于哪个实体组件
    @Parent
    private Person person;
    public Person getPerson() {
        return person;
    }
    public void setPerson(Person person) {
        this.person = person;
    }
    public Address(String province, String city) {
        super();
        this.province = province;
        this.city = city;
    }
    public String getProvince() {
        return province;
    }
    public void setProvince(String province) {
        this.province = province;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
}

测试:

package com.ydoing.test;

import java.util.Arrays;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

import com.ydoing.domain.Address;
import com.ydoing.domain.Person;

public class Main {
    public static void main(String[] args) {
        Configuration conf = new Configuration();
        conf.configure();
        // ServiceRegistry serviceRegistry = new
        // ServiceRegistryBuilder().applySettings(conf.getProperties())
        // .buildServiceRegistry();
        ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(conf.getProperties())
                .build();
        SessionFactory factory = conf.buildSessionFactory(serviceRegistry);
        Session session = factory.openSession();

        Person person = new Person();
        person.setName("Jack");
        person.setAge(22);
        person.setSex("男");

        // 不会持久化
        person.setAlias("Arron");

        // List属性
        String[] array = { "cat", "dog", "snake" };
        List<String> pets = Arrays.asList(array);
        person.setPets(pets);

        // 数组属性
        String[] schools = { "清华", "北大" };
        person.setSchools(schools);

        // Set集合属性
        person.getCars().add("奥迪");
        person.getCars().add("大众");

        // Map属性
        person.getPayroll().put("基本工资", (float) 5000);
        person.getPayroll().put("绩效", (float) 3000);

        person.setAddress(new Address("浙江", "杭州"));

        Transaction tx = session.getTransaction();
        tx.begin();
        session.save(person);

        Person p = (Person) session.load(Person.class, 12);
        System.out.println(p.getProfile());

        tx.commit();
        session.close();
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-09 22:05:57

Hiberate基础用法实例的相关文章

SQL基础用法(实例二)

1 /* 2 3 4 2006年10月01日 5 6 SQL Server 数据库的高级操作 7 (1) 批处理 8 (2) 变量 9 (3) 逻辑控制 10 (4) 视图 11 (5) 函数 12 (6) 高级查询 13 14 */ 15 16 (1)批处理 17 将多条SQL语句作为一个整体去编译,生成一个执行计划,然后,执行! 18 理解批处理的关键在于"编译",对于由多条语句组成的一个批处理, 19 如果在编译时,其中,有一条出现语法错误,将会导致编译失败! 20 21 cre

SQL基础用法(实例一)

1 /* 2 3 4 2006年10月01日 5 6 SQL Server 数据库的基本操作 7 (1) 数据库的创建 8 (2) 数据表的创建以及相关约束的指定(含临时表) 9 (3) 数据的添/删/改 10 (4) 数据的查询 11 12 */ 13 14 (0)创建数据库 15 -- 指定数据库名称 16 -- (注:如果数据库名中包含空格可以使用[]将其标示) 17 create database [Super WC] 18 -- 关于数据文件的定义 19 on 20 ( 21 name

2017.04 vue学习笔记---08表单控件绑定---基础用法

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <style> div{ margin-bottom: 30px; } </style> <script src="js/vue.js"></script> <

Vue组件基础用法

前面的话 组件(Component)是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码.根据项目需求,抽象出一些组件,每个组件里包含了展现.功能和样式.每个页面,根据自己所需,使用不同的组件来拼接页面.这种开发模式使前端页面易于扩展,且灵活性高,而且组件之间也实现了解耦.本文将详细介绍Vue组件基础用法 概述 组件是一个自定义元素或称为一个模块,包括所需的模板.逻辑和样式.在HTML模板中,组件以一个自定义标签的形式存在,起到占位符的功能.通过Vue.js的声明式渲染后,

多线程中的锁系统(一)-基础用法

目录 一:lock.Monitor 1:基础. 2: 作用域. 3:字符串锁. 4:monitor使用 二:mutex 三:Semaphore 四:总结 一:lock.Monitor 1:基础 Lock是Monitor语法糖简化写法.Lock在IL会生成Monitor. //======Example 1===== string obj = "helloworld"; lock (obj) { Console.WriteLine(obj); } //lock IL会编译成如下写法 bo

C#中string用法实例详解

在进行C#程序设计时,用的最多的莫过于string了,但有些时候由于不仔细或者基础的不牢固等因素容易出错,今天本文就来较为详细的总结一下C#中string的用法.具体如下: 1.string是一个引用类型,平时我们比较string对象,比较的是对象的值而不是对象本身 如下面代码所示: string strA="abcde"; string strB="abc"; string strC="de"; Console.WriteLine(strA =

C#的FileSystemWatcher用法实例详解

本文实例详述了C#的FileSystemWatcher用法.分享给大家供大家参考.具体用法如下: FileSystemWatcher控件主要功能: 监控指定文件或目录的文件的创建.删除.改动.重命名等活动.可以动态地定义需要监控的文件类型及文件属性改动的类型. 1.常用的几个基本属性: (1) Path :设置要监视的目录的路径. (2) IncludeSubdirectories :设置是否级联监视指定路径中的子目录. (3) Filter :设置筛选字符串,用于确定在目录中监视哪些类型的文件

Winform动态加载TabControl用法实例

本文实例讲述了Winform动态加载TabControl用法.分享给大家供大家参考. 具体实现代码如下: 代码如下: private void BindTabData() { dtIPD = new DataTable(); //drItem = new DataTable(); //获取[项目大类]列表显示于 TabPage MRD_Score model = new MRD_Score(); model.ActiveFlag = "Y"; DataTable dtScore = f

vue的基础用法

基础用法(没有搭建框架就在html文件里演示) 一. Hello World起步 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Hello World</title> </head> <body> <!-- 模板 --> <div id="app&qu