【hibernate框架6】各種問題用註解Annotation和mxl配置的解決

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.csdn.net/acmman
--------------------- 
作者:光仔December 
來源:CSDN 
原文:https://blog.csdn.net/acmman/article/details/43193447 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章