【hibernate框架6】各种问题用注解Annotation和mxl配置的解决

本文详细介绍了Hibernate框架中实体类与数据库表之间的映射规则,包括表名、字段名、日期类型、枚举类型及映射位置的配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.表名和类名不同,对表名进行配置


a)Annotation:


一般说来,表名一定要和实体类的名称一样。
但如果表明和实体类名不一致,可以用以下两种方式指明实体类对应的表名:


1.Annotation情况下:

package cn.edu.hpu.model;
 
 
import javax.persistence.Entity;
import javax.persistence.Id;
 
 
import javax.persistence.Table;
 
 
//‘@+语句’就叫做注解
//@Entity表示这家伙是个实体类
 
 
//@Table(name="_teacher")
//指定实体类对应的表名(如果没有这个表hibernate会自动创建)
 
 
@Entity 
@Table(name="_teacher")
public class Teacher {
	private String name;
	private int id;
	private String title;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	@Id
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	
	
}

运行测试类时自动创建了表(可不会自动创建数据库哦)
自动创建表是由hibernate.cfg.xml中的这个配置语句决定的:

<!-- Drop and re-create the database schema on startup 是否自动生成建表语句-->
        <property name="hbm2ddl.auto">update</property>

b)xml:
在实体类的配置文件(如Student.hbm.xml)中的class标签里写 table="stu"指定表名:

<class name="Student" table="stu">

2.字段名和属性不同
a)字段名的get方法上的注解默认为@Basic,不用写。但是如果字段名和表里属性值不一样的时候,需要用@Column来解决,name指定插入到数据库的属性名(如果没有,hibernate会自动创建)

@Column(name="_title")
	public String getTitle() {
		return title;
	}

b)xml中不用写column(如果你非要配,就是这样):

 <property name="name" column="_name"></property>

3.不需要psersistence的字段
a)Annotation:@Transient

在JavaBean中这样写

private String yourWifeName;
	
	@Transient
	public String getYourWifeName() {
		return yourWifeName;
	}
	public void setYourWifeName(String yourWifeName) {
		this.yourWifeName = yourWifeName;
	}

就不会对yourWifeName进行持久化,也就不会在数据库中创建这个属性

b)xml不写


4.映射日期与时间类型,指定时间精度
a)Annotation:@Temporal
在teacher的javabean中加入Date字段生成属性:

private Date brithday;
	
	public Date getBrithday() {
		return brithday;
	}
	public void setBrithday(Date brithday) {
		this.brithday = brithday;
	}

数据库会生成一个datetime类型的属性


在测试类中添加生日(为当前日期):
t.setBrithday(new Date());


会在数据库中看到存入的数值:
2014-12-03 15:05:31


那么如果只想要日期,或者只想要时间,就需要对时间进行精确定位,方法为:

@Temporal(TemporalType.DATE)
	public Date getBrithday() {
		return brithday;
	}

数据库的相应属性就会改成Date类型,只会存储日期,不存时间
b)xml:指定type

<property name="brithday" type="date"></property>

5.映射枚举类型
a)@Enumerated


创建了一个枚举类型,用来存放职称的等级。

public enum ZhiCheng {
		A,B,C;
	}

在javabean创建相应字段和属性:

private ZhiCheng zhicheng;
	
	public ZhiCheng getZhicheng() {
		return zhicheng;
	}
	public void setZhicheng(ZhiCheng zhicheng) {
		this.zhicheng = zhicheng;
	}

因为是特殊类型,hibernate无法向数据库相应表中构建正确类型的属性,所以要重新指定字段的类型:
指定为string:

@Enumerated(EnumType.STRING)
	public ZhiCheng getZhicheng() {
		return zhicheng;
	}

指定为integer:

@Enumerated(EnumType.ORDINAL)
	public ZhiCheng getZhicheng() {
		return zhicheng;
	}

b)xml:非常麻烦



6.字段映射的位置(field或者get方法):
a)best practice:保持field和get set方法的一致
字段映射的位置(如@Id)可以放在field上面,也可以放在get方法上
例如放在get方法上:

private int id;
	@Id
	public int getId() {
		return id;
	}
	
	public void setId(int id) {
		this.id = id;
	}

放在field上: 

@Id
	private int id;
	public int getId() {
		return id;
	}
	
	public void setId(int id) {
		this.id = id;
	}

一般工作的写法,是放在field上,这样看起来比较集中。但是,这种写法实际上破坏了java的面向对象的封装性。
原因是,字段一般说是private的。如果你在私有的上面写了注解的话,就相当于hibernate直接去访问你私有的成员变量(用反射机制)。
从设计上来讲,不推荐用放在field上的写法,因为们把成员变量设成私有的就是不想让外部类去直接拿我们的数据,这样不合适。

转载请注明出处:http://blog.youkuaiyun.com/acmman
--------------------- 
作者:光仔December 
来源:优快云 
原文:https://blog.youkuaiyun.com/acmman/article/details/43193447 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值