用户登录
用户注册

分享至

hibernate实体类构造方法

  • 作者: 爱漂亮爱段子
  • 来源: 51数据库
  • 2021-01-30
1:一定要默认构造,不带参数的构造也可以,不然Hibernate无法帮你管理这个java类,因为Hibernate内部创建这个对象是通过反射的一个方法的,而这个方法要求必须为无参构造
2:建议类不要设置为final 因为延迟加载是通过代理模式的,所以这个类需要可以被继承
3:最好设置一个无意义的属性为id(主键)
4:getset



  10.1 实体类的映射
从java的角度讲,实体类就是普通的java封装类(有人称为pojo有人称为vo)。仅从实体类中的代码信息,hibernate并不能得知该实体类对应哪个数据表,因此还需要以某种方式配置一下。常用的方式有*.hbm.xml文件配置与@注解配置两种。
hbm.xml文件就是普通的xml文件,hbm为hibernate mapping的缩写,这样从文件名上就能判断该文件为hibernate实体类配置文件。在jpa出现之前,hibernate都使用hbm.xml文件配置。jpa出现后,推荐使用jpa的@注解配置,因为对于所有的orm框架,@注解都是通用的。
10.1.1 使用@注解配置实体类
实体类一般有id、普通属性、集合属性等,分别对应数据库的主键、普通列、外键。@注解配置中,实体类用@entity注解,用@table指定对应的数据表,用@id配置主键,用@column配置普通属性,用@onetomany、@manytoone、@onetoone、@manytomany配置实体间关系等。实体类之间的关于在后面的章节中会做详细介绍。下面编写一个usersvo类,在该类中使用@注解配置实体类的映射,usersvo类的代码如下:
package com.cn.vo;
import javax.persistence.*;
@entity // 注解entity表示该类纳入hibernate管理,能够被持久化
@table(name = "users") // 指定该实体类对应的数据库表名
public class usersvo {
// fields
@id // 指定该列为主键。
// 这个注解用来表示主键类型, auto为数据库自增长类型
@generatedvalue(strategy = generationtype.auto)
private int id;

@column(name = "name") //指定变量对应的数据库表的列为"name"
private string name;

@column(name = "age")//指定变量对应的数据库表的列为"age"
private int age;

@column(name = "tel")//指定变量对应的数据库表的列为"tel"
private string tel;

@column(name = "address")//指定变量对应的数据库表的列为"address"
private string address;

// constructors

public usersvo() {
}

public usersvo(int id) {
this.id = id;
}

public usersvo(int id, string name, int age, string tel,
string address) {
this.id = id;
this.name = name;
this.age = age;
this.tel = tel;
this.address = address;
}

public string getaddress() {
return address;
}
public void setaddress(string address) {
this.address = address;
}
public int getage() {
return age;
}
public void setage(int age) {
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 string gettel() {
return tel;
}
public void settel(string tel) {
this.tel = tel;
}
}
上述代码中,所有的@注解都是javax.persistence.*下的,而不是org.hibernate.*下的。javax.persistence.*下的注解为jpa规范规定的注解,用于标注实体类与数据库的映射关系,而org.hibernate.*下的注解仅用于补充,当某个功能jpa暂时不支持而hibernate支持时使用。
10.1.2 使用xml文件配置实体类映射
多个实体类可以配置在一个xml文件中。hibernate推荐xml映射文件和实体类同名,便于阅读和维护,比如usersvo.java文件对应usersvo. hbm.xml文件。xml文件一般以“.hbm.xml”结尾,便于辨认,也可以直接用“.xml”结尾。例如usersvo类的映射文件可取名为“usersvo.hbm.xml”或者“usersvo.xml”。使用xml文件配置实体类映射的时候,实体类和普通的实体类一样,和数据库的映射关系放在xml文件中,usersvo. hbm.xml文件代码如下:

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">






















代码中的doctype指定的dtd文件位于hibernate.jar中。dtd文件为xml格式验证文件,hibernate使用该dtd来验证该xml文件格式是否正确。如果hibernate.jar或者classpath中不存在该dtd文件,hibernate会到指定的url下载该文件。
在上述的映射文件中,中的name表示实体类的路径和名称。table="”用来指定数据库表格 catalog表示连接的数据库 lazy表示延迟加载,用来声明表的主键,中的属性name="id"表示实体类的属性id。数据库对应的字段名放在中,中的name表示表中的字段名,表示数据库表的主键类型为默认的类型,默认的类型是不自动增长类型,在中映射表中的其他字段,中的name属性值表示实体类的属性,type表示实体类属性的类型。表字段的映射放在中,name的值是字段名,length表示字段长度。
10.1.3 在hibernate.cfg.xml文件中配置实体类映射
实体类还需要配置到hibernate.cfg.xml中,以便hibernate初始化实体类与数据库表的映射关系。如果只配置了映射关系,而没有配置到hibernate.cfg.xml中,hibernate是无法解析实体类的,因为hibernate无法自行判断哪些是实体类。
如果实体类是使用@注解配置的,需要用配置,而如果是用xml文件配置的,需要用配置xml配置文件。hibernate.cfg.xml文件中配置实体类映射的示例代码如下:






10.1.4 配置主键映射
实体类最好有主键列,并有对应的getter、setter方法,这是hibernate推荐的。主键尽量使用可以为null值的类型,例如integer、long、string等,而不要使用int、long等。因为如果主键为null,则表示该实体类还没有保存到数据库,是一个临时状态(transient),而int、long等原始类型则不具备该功能。
1. 使用@注解配置主键
hibernate中用@id声明该列为主键列,同时用@column声明该列的列名。当列名与属性名相同时,@column配置可省略。@generatedvalue用于指定主键的生成策略。hibernate支持多种逐渐生成规则,例如自增长、由某个表决定、由sequence决定等等。如果不配置@generatedvalue,则必须手动设置id值。
@id
@column(name = "id")
// 设置主键类型, auto表示主键是自增长类型
@generatedvalue(strategy = generationtype.auto)
private integer id;
2. xml文件中配置主键
如果使用xml配置,主键用配置,name指定实体类的主键属性,column指定数据表中的主键列名。使用嵌套的配置主键生成策略,native表示使用数据库自己的策略,在mysql中就是自增长类型,如果不用自动增长类型,则可以用assigned,例如:


软件
前端设计
程序设计
Java相关