六、Hibernate的字段映射类型

基本类型映射:

Java类型Hibernate映射类型标准SQL类型大小和取值范围
int/Integerint/integerINTEGER4Byte
long/Long   longBIGINT8Byte
short/ShortshortSAMLLINT2Byte
byte/BytebyteTINYINT1Byte
float/FloatfloatFLOAT4Byte
double/DoubledoubleDOUBLE8Byte
BigDecimalbig_decimalNUMBERICNumeric(8,2)
char/Character/StringcharacterCHAR(1)定长字符
StringstringVARCHAR变长字符
boolean/BooleanbooleanBIT布尔类型
boolean/Booleanyes/noCHAR(1)('Y'/'N')布尔类型
boolean/Booleantrue/falseCHAR(1)('T'/'F')布尔类型

Java时间和日期类型的Hibernate映射类型: 

Java类型Hibernate映射类型标准SQL类型描述
java.util.Date/java.sql.DatedateDATE日期,yyyy-mm-dd
java.util.Date/java.sql.TImetimeTIME时间,hh:mm:ss
java.util.Date/java.sql.TimestamptimestampTIMESTAMP时间戳,yyyymmddhhmmss
java.util.CalendarcalendarTIMESTAMP同上
java.util.Calendarcalendar_dateDATE日期,yyyy-mm-dd

Java 大对象类型的Hibernate映射类型:

Java类型Hibernate映射类型标准SQL类型MySql类型Oracle类型
byte[]binaryVARBINARY/BLOBBLOBBLOB
StringtextCLOBTEXTCLOB
serializable实现serializable接口的一个java类VARBINARY/BLOBBLOBBLOB
java.sql.ClobclobCLOBTEXTCLOB
java.sql.BlobblobBLOBBLOBBLOB

用个图书对象举例:

 Book.java:

package com.tao.entity;

import java.sql.Blob;
import java.util.Date;

public class Book {
	
	private int id;
	private String bookName;	//图书名称
	private float price;		//图书价格
	private boolean speciaPrice;	//是否特价
	private Date publishDate;	//发布日期
	private String author;		//作者
	private String introduction;	//简介
	private Blob bookPic;	//图片封面
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getBookName() {
		return bookName;
	}
	public void setBookName(String bookName) {
		this.bookName = bookName;
	}
	public float getPrice() {
		return price;
	}
	public void setPrice(float price) {
		this.price = price;
	}
	public boolean isSpeciaPrice() {
		return speciaPrice;
	}
	public void setSpeciaPrice(boolean speciaPrice) {
		this.speciaPrice = speciaPrice;
	}
	public Date getPublishDate() {
		return publishDate;
	}
	public void setPublishDate(Date publishDate) {
		this.publishDate = publishDate;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public String getIntroduction() {
		return introduction;
	}
	public void setIntroduction(String introduction) {
		this.introduction = introduction;
	}
	public Blob getBookPic() {
		return bookPic;
	}
	public void setBookPic(Blob bookPic) {
		this.bookPic = bookPic;
	}
}

Book.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.tao.entity">
	<class name="Book" table="t_book">
		<id name="id" column="book_id">
			<generator class="native"></generator>
		</id>
		<!-- 字符串类型 -->
		<property name="bookName" column="book_name" length="40"></property>
		<!-- 浮点类型 -->
		<property name="price" column="book_price" type="float"></property>
		<!-- 布尔类型 -->
		<property name="speciaPrice" column="book_speciaPrice" type="boolean"></property>
		<!-- 日期类型 -->
		<property name="publishDate" column="book_publishDate" type="date"></property>
		<!-- 字符串类型 -->
		<property name="author" column="book_author" length="20"></property>
		<!-- 文本类型 -->
		<property name="introduction" column="book_introduction" type="text"></property>
		<!-- 二进制类ixng -->
		<property name="bookPic" column="book_bookPic" type="blob"></property>
	</class>

</hibernate-mapping>

TesstBook.java:

	@Test
	public void test() throws Exception {
		Book book = new Book();
		book.setBookName("java编程思想");
		book.setPrice(100);
		book.setSpeciaPrice(true);
		
		book.setPublishDate(new Date());
		book.setAuthor("埃克尔");
		book.setIntroduction("简介.......");
		LobHelper lobHelper = session.getLobHelper();
		InputStream inputStream = new FileInputStream("E://java编程思想.jpg");
		Blob blob = lobHelper.createBlob(inputStream, inputStream.available());
		book.setBookPic(blob);
		session.save(book);

	}

插入成功,看数据库生成的表:

 

关于当前日期入库:

1.如果数据库是Date 类型:

java中:直接 setDate(new Date()) 即可.数据库只存储时间

2.如果数据库字段是 dateTime类型:

Date date = new Date();

Timestamp timeStamp = new Timestamp(date.getTime()); 即可

集合类型的映射:

1.Set 无序 元素不可重复::

Worker.java:

package com.tao.entity;

import java.util.Set;

public class Worker {
	
	private long id;
	private String name;
	private Set<String> images;
	
	
	public Set<String> getImages() {
		return images;
	}
	public void setImages(Set<String> images) {
		this.images = images;
	}
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	

}

Worker.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
        
<hibernate-mapping package="com.tao.entity">
	<class name="Worker" table="t_worker">
		<id name="id" column="worker_id">
			<generator class="native"></generator>
		</id>
		
		<property name="name" column="worker_name" length="30"></property>
		<set name="images" table="t_image">
            <!-- column 为 t_image 表的外键字段 关联t_worker主键 -->
			<key column="workerId"></key>
			<element column="image_name" type="string"></element>
		</set>
	</class>



</hibernate-mapping>

TestWorker:

@Test
	public void testSetSave() throws Exception {
		Set<String> imageSet = new HashSet<String>();
		imageSet.add("生活照.png");
		imageSet.add("工作照.png");
		imageSet.add("自拍照.png");
		imageSet.add("工作照.png");
		imageSet.add("生活照.png");
		
		Worker worker = new Worker();
		worker.setImages(imageSet);
		worker.setName("一号工人");
		session.save(worker);
		
	}

看数据库生成的表结构:

且有一个外键维护: 

我们试试查询结果:

@Test
	public void testSetFetch() throws Exception {
		Worker worker = (Worker) session.get(Worker.class, Long.valueOf(1));
		Iterator<String> iterator = worker.getImages().iterator();
		while(iterator.hasNext()){
			System.out.println(iterator.next());
		}
	}
Hibernate: select worker0_.worker_id as worker_i1_5_0_, worker0_.worker_name as worker_n2_5_0_ from t_worker worker0_ where worker0_.worker_id=?
Hibernate: select images0_.workerId as workerId1_5_0_, images0_.image_name as image_na2_2_0_ from t_image images0_ where images0_.workerId=?
自拍照.png
生活照.png
工作照.png

只有三条,无序 而且之前插入没有重复。

2,List 有序 元素可重复

Worker2.java:

package com.tao.entity;

import java.util.List;
/**
 * List映射类型举例
 * @author TaoGG
 *
 */
public class Worker2 {
	
	private long id;
	private String name;
	private List<String> images;
	
	public List<String> getImages() {
		return images;
	}
	public void setImages(List<String> images) {
		this.images = images;
	}
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	

}
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
        
<hibernate-mapping package="com.tao.entity">
	<class name="Worker2" table="t_worker2">
		<id name="id" column="worker_id">
			<generator class="native"></generator>
		</id>
		
		<property name="name" column="worker_name" length="30"></property>
		<list name="images" table="t_image2">
			<key column="workerId"></key>
			<list-index column="imageIndex"></list-index>
			<element column="image_name" type="string"></element>
		</list>
	</class>
	
</hibernate-mapping>

Test:

@Test
	public void testListSave() throws Exception {
		List<String> imageList = new ArrayList<String>();
		imageList.add("生活照.png");
		imageList.add("工作照.png");
		imageList.add("自拍照.png");
		imageList.add("工作照.png");
		imageList.add("生活照.png");
		
		Worker2 worker = new Worker2();
		worker.setName("一号工人");
		worker.setImages(imageList);
		session.save(worker);
		
	}

	@Test
	public void testSetFetch() throws Exception {
		Worker2 worker2 = (Worker2) session.get(Worker2.class, Long.valueOf(1));
		List<String> imagesList = worker2.getImages();
		for(String s:imagesList){
			System.out.println(s);
		}
	}

看表结构:

多了个索引字段 保证有序,且可重复。

3,Bag 无序 元素可重复:

Worker3.java:(Bag采用List使用)

package com.tao.entity;

import java.util.List;
/**
 * List映射类型举例
 * @author TaoGG
 *
 */
public class Worker3 {
	
	private long id;
	private String name;
	private List<String> images;
	
	public List<String> getImages() {
		return images;
	}
	public void setImages(List<String> images) {
		this.images = images;
	}
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	

}

Worker3.hbm.xml:

Bag有自己的主键和生成策略,没有索引:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
        
<hibernate-mapping package="com.tao.entity">
	<class name="Worker3" table="t_worker3">
		<id name="id" column="worker_id">
			<generator class="native"></generator>
		</id>
		
		<property name="name" column="worker_name" length="30"></property>
		<idbag name="images" table="t_image3">
			<!-- 增加一个主键 -->
			<collection-id type="long" column="image_id">
				<generator class="increment"></generator>
			</collection-id>
			<key column="workerId"></key>
			<element column="image_name" type="string"></element>
		</idbag>
	</class>
	
</hibernate-mapping>

Test:

@Test
	public void testBagSave() throws Exception {
		List<String> imList = new ArrayList<String>();
		imList.add("生活照.png");
		imList.add("工作照.png");
		imList.add("自拍照.png");
		imList.add("生活照.png"); 
		Worker3 worker3 = new Worker3();
		worker3.setImages(imList);;
		session.save(worker3);
	}
	

数据库表:可重复 生成主键 以及外键和t_worker3表关联。

遍历查询:

@Test
	public void testSetFetch() throws Exception {
		Worker3 worker3 = (Worker3) session.get(Worker3.class, Long.valueOf(1));
		List<String> images = worker3.getImages();
		for(String s:images){
			System.out.println(s);
		}
		
	}

结果:可重复 无序

Hibernate: select worker3x0_.worker_id as worker_i1_9_0_, worker3x0_.worker_name as worker_n2_9_0_ from t_worker3 worker3x0_ where worker3x0_.worker_id=?
Hibernate: select images0_.workerId as workerId1_9_0_, images0_.image_name as image_na2_4_0_, images0_.image_id as image_id3_0_ from t_image3 images0_ where images0_.workerId=?
生活照.png
工作照.png
自拍照.png
生活照.png

4,Map 键值对:

Work4.java:

package com.tao.entity;

import java.util.Map;
/**
 * List映射类型举例
 * @author TaoGG
 *
 */
public class Worker4 {
	
	private long id;
	private String name;
	private Map<String,String> images;
	
	public Map<String, String> getImages() {
		return images;
	}
	public void setImages(Map<String, String> images) {
		this.images = images;
	}
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	

}

Work4.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
        
<hibernate-mapping package="com.tao.entity">
	<class name="Worker4" table="t_worker4">
		<id name="id" column="worker_id">
			<generator class="native"></generator>
		</id>
		
		<property name="name" column="worker_name" length="30"></property>
		<map name="images" table="t_image4">
			<!-- 定义外键 -->
			<key column="workId"></key>
			<!-- 定义map的key -->
			<map-key column="image_key" type="string"></map-key>
			<element column="image_name" type="string"></element>
		</map>
		
	</class>
	
</hibernate-mapping>

Test:

@Test
	public void testBagSave() throws Exception {
		List<String> imList = new ArrayList<String>();
		Map<String, String> map = new HashMap<String, String>();
		map.put("i1", "生活照.png");
		map.put("i2", "工作照.png");
		map.put("i3", "自拍照.png");
		map.put("i4", "生活照.png");
		
		Worker4 worker4 = new Worker4();
		worker4.setImages(map);
		session.save(worker4);
	}

数据库表:

复合主键

@Test
	public void testSetFetch() throws Exception {
		Worker4 worker4 = (Worker4) session.get(Worker4.class, Long.valueOf(1));
		Map<String, String> images = worker4.getImages();
		Iterator<Entry<String, String>> iterator = images.entrySet().iterator();
		while(iterator.hasNext()){
			Entry<String, String> next = iterator.next();
			System.out.println(next.getKey()+"---"+next.getValue());
		}
	}

结果:

Hibernate: select worker4x0_.worker_id as worker_i1_11_0_, worker4x0_.worker_name as worker_n2_11_0_ from t_worker4 worker4x0_ where worker4x0_.worker_id=?
Hibernate: select images0_.workId as workId1_11_0_, images0_.image_name as image_na2_5_0_, images0_.image_key as image_ke3_0_ from t_image4 images0_ where images0_.workId=?
i1---生活照.png
i2---工作照.png
i3---自拍照.png
i4---生活照.png

 

Hibernate 中,Java 的基本数据类型和对应的包装类是可以互换使用的,但是在进行字段映射时,需要注意以下几点: 1. 建议使用包装类,避免空指针异常:在 Java 中,基本数据类型是不能为 null 的,但是包装类可以为 null。在进行数据库操作时,如果使用基本数据类型,当数据库中对应的字段为 null 时,就会抛出空指针异常。因此建议使用包装类,可以避免这种异常的出现。 2. 数据库中的字段类型要和 Java 类型一致:在进行字段映射时,需要确保数据库中的字段类型和 Java 类型一致,否则可能导致数据类型转换异常。 3. 对于布尔类型字段,建议使用包装类 Boolean:因为在数据库中,布尔类型字段通常使用 tinyint(1) 类型表示,如果使用基本数据类型 boolean 进行映射,会导致数据类型转换异常。 4. 对于数值类型字段,建议使用包装类:因为在数据库中,数值类型字段通常会有默认值,如果使用基本数据类型进行映射,当数据库中对应的字段为 null 时,就会使用默认值进行赋值,而这个默认值可能会影响业务逻辑的正确性。 下面是一个示例代码,演示了如何在 Hibernate 中进行字段映射: ``` @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "username") private String username; @Column(name = "age") private Integer age; @Column(name = "is_admin") private Boolean isAdmin; // getter 和 setter 方法省略 } ``` 在上面的示例中,我们使用了包装类 Integer 和 Boolean 进行字段映射,避免了空指针异常和数据类型转换异常的问题。同时,我们还指定了数据库中对应的字段名,确保了数据类型一致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值