HIbernate映射类型

一、基本映射类型

97b63a9cb820a906a4fe9c90d023416b89c.jpg

实例:

d87980f368014d23e413e41652ee9181fbb.jpg

Book.java

package com.java1234.model;

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

public class Book {

	private int id;
	private String bookName; // 图书名称
	private float price; // 图书价格
	private boolean specialPrice; // 是否是特价
	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 isSpecialPrice() {
		return specialPrice;
	}
	public void setSpecialPrice(boolean specialPrice) {
		this.specialPrice = specialPrice;
	}
	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.java1234.model">

	<class name="Book" table="t_book">
		<id name="id" column="bookId">
			<generator class="native"></generator>
		</id>
		
		<property name="bookName" column="bookName" length="40"></property>
		<property name="price" column="price" type="float"></property>
		<property name="specialPrice" column="specialPrice" type="boolean"></property>

                 <!--在Hibernate中映射文件*.hbm.xml中type="date"和不写type="date"的区别:
                   第一种:type="date"
                   <property name="createTime" column="createTime"  type="date"></property>
                    页面显示时间格式:yyyy-MM-dd
                  第二种:不写type="date"
                   <property name="createTime"column="createTime" ></property>
                     页面显示时间格式:yyyy-MM-dd HH:mm:ss

                   -->
		<property name="publishDate" column="publishDate" type="date"></property>
		<property name="author" column="author" length="20"></property>
		<property name="introduction" column="introduction" type="text"></property>
		<property name="bookPic" column="bookPic" type="blob"></property>
	</class>

</hibernate-mapping>

BookTest.java

public class BookTest {

	public static void main(String[] args) {
		SessionFactory sessionFactory=HibernateUtil.getSessionFactory();
		  Session session=sessionFactory.openSession(); // 生成一个session
		    session.beginTransaction(); // 开启事务
		    
		  
		    
		    session.getTransaction().commit(); // 提交事务
		    session.close(); // 关闭session
	}
}

数据库生成的表:

a757163052e16e0d8e7cb0749282b3cf10a.jpg

因为涉及到图片类型的存储(private Blob bookPic; ),更新一下数据库驱动

e1d342c1fc3a9b80c2892624e09d1a34426.jpg

图片放到c盘

808a4311f55fc69f20dbc8cc4b0219170d8.jpg

BookTest

package com.java1234.service;

import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Blob;
import java.text.SimpleDateFormat;

import org.hibernate.LobHelper;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

import com.java1234.model.Book;
import com.java1234.util.HibernateUtil;

public class BookTest {
	
	public static void main(String[] args) throws Exception{
		SessionFactory sessionFactory=HibernateUtil.getSessionFactory();
		Session session=sessionFactory.openSession(); // 生成一个session
	    session.beginTransaction(); // 开启事务
	    
	    Book book=new Book();
	    book.setBookName("java编程思想");
	    book.setPrice(100);
	    book.setSpecialPrice(true);
	    book.setPublishDate(new SimpleDateFormat("yyyy-MM-dd").parse("2013-1-1"));
	    book.setAuthor("埃克尔");
	    book.setIntroduction("简介...");
	    
		//Hibernate提供的LobHelper图片操作接口
	    LobHelper lobHelper=session.getLobHelper();
		//定义文件输入流
	    InputStream in=new FileInputStream("c://java编程思想.jpg");
		//createBlob(输入流, 长度)
	    Blob bookPic=lobHelper.createBlob(in, in.available());
	    book.setBookPic(bookPic);
	   
	    session.save(book);
	    session.getTransaction().commit(); // 提交事务
	    session.close(); // 关闭session
	 
	}
}

执行

数据库

fbc78031857ffa4c065e18c38b8bf226526.jpg

359fddf64e70ed97c8012bc43292737406a.jpg

 

二、集合映射类型

不同于映射关系一对多,不在session缓存中的,不带OID的,就是数据集合

a0d3f2b1c09466f6f8b334ddd7f581d2e3e.jpg

实例:

1.Set

Student.java

package com.java.model;

import java.util.Set;

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

Student.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">
<!-- 要写package="com.java.model" -->
<hibernate-mapping package="com.java.model">
      <class name="Student" table="t_student">
		<id name="id" column="stuId">
			<generator class="native"></generator>
		</id>
		
		<property name="name" column="stuName"></property>
		
		<set name="images" table="t_image">
		   <!---->
			<key column="studentId"></key>
			<!---->
			<element column="imageName" type="string"></element>
		</set>
	</class>

</hibernate-mapping>

hibernate.cfg.xml

     <!--导入映射文件-->
     <mapping resource="com/java/model/Student.hbm.xml"/>

StudentTest.java

 @Test
	public void testSetSave(){
		Set<String> imageSet=new HashSet<String>();
		imageSet.add("image1.png");
		imageSet.add("image2.png");
		imageSet.add("image3.png");
		imageSet.add("image3.png");
		
		Student s1=new Student();
		s1.setName("张三");
		s1.setImages(imageSet);
		session.save(s1);
	}
    
    @Test
	public void testSetFetch(){
		Student student=(Student)session.get(Student.class, Long.valueOf(1));
		Iterator it=student.getImages().iterator();
		while(it.hasNext()){
			System.out.println(it.next());
		}
	}

数据库:d60000f5bb311e6ec892b4e29ebb42f787d.jpg307b80953cc6bd924b9ae6521d1548fd499.jpg65bdc5ef899c245981d38046036d9eee2f7.jpg重复的数据加不进去

取数据是无序的bedb6afb2629634a7747282b8fd3ef3f0a8.jpg

2.list

Student2.java

package com.java.model;

import java.util.List;

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

Student2.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">
<!-- 要写package="com.java.model" -->
<hibernate-mapping package="com.java.model">
      <class name="Student2" table="t_student">
		<id name="id" column="stuId">
			<generator class="native"></generator>
		</id>
		
		<property name="name" column="stuName"></property>
		
		<list name="images" table="t_image2">
		
			<key column="studentId"></key>
			<!--这里要加一个索引-->
			<list-index column="imageIndex"></list-index>
			<element column="imageName" type="string"></element>
		</list>
	</class>

</hibernate-mapping>

hibernate.cfg.xml

    <mapping resource="com/java/model/Student2.hbm.xml"/>

StudentTest.java

        @Test
	public void testListSave(){
		List<String> imageList=new ArrayList<String>();
		imageList.add("image1.png");
		imageList.add("image2.png");
		imageList.add("image3.png");
		imageList.add("image3.png");
		
		Student2 s2=new Student2();
		s2.setName("李四list");
		s2.setImages(imageList);
		session.save(s2);
	}
	
	@Test
	public void testListFetch(){
		Student2 student2=(Student2)session.get(Student2.class, Long.valueOf(2));
		Iterator it=student2.getImages().iterator();
		while(it.hasNext()){
			System.out.println(it.next());
		}
	}

数据库:e0ac0a0f283f478d5798adbffc57f9cb129.jpg58da98d22d7e5a920f6e8dc9b76e10677d1.jpgb1b3bf27c80f788c7136426b63b0f9d3036.jpg发现多了索引imageIndex,可以重复

打印数据:757a03d326e8ac8016f58ad39d47cbad699.jpg

 

3.bag

Student3.java

package com.java.model;

import java.util.List;

public class Student3 {
	private String name;
	private long id;
	//bag,由hibernate提出,用list集合
	private List<String> images;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	public List<String> getImages() {
		return images;
	}
	public void setImages(List<String> images) {
		this.images = images;
	}
	
	
}

Student3.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">
<!-- 要写package="com.java.model" -->
<hibernate-mapping package="com.java.model">
      <class name="Student3" table="t_student">
		<id name="id" column="stuId">
			<generator class="native"></generator>
		</id>
		
		<property name="name" column="stuName"></property>
		
		<idbag name="images" table="t_image3">
		    <!-- 定义一个主键 -->
			<collection-id type="long" column="imageId">
			    <!-- 主键生成策略 -->
				<generator class="increment"></generator>
			</collection-id>
			<!-- 外键 -->
			<key column="studentId"></key>
			<element column="imageName" type="string"></element>
		</idbag>
	</class>

</hibernate-mapping>

hibernate.cfg.xml

    <mapping resource="com/java/model/Student3.hbm.xml"/>

StudentTest.java

@Test
	public void testBagSave(){
		List<String> imageList=new ArrayList<String>();
		imageList.add("image1.png");
		imageList.add("image2.png");
		imageList.add("image3.png");
		imageList.add("image3.png");
	
		Student3 s3=new Student3();
		s3.setName("王五bag");
		s3.setImages(imageList);
		session.save(s3);
	}
	
	@Test
	public void testBagFetch(){
		Student3 student3=(Student3)session.get(Student3.class, Long.valueOf(3));
		Iterator it=student3.getImages().iterator();
		while(it.hasNext()){
			System.out.println(it.next());
		}
	}

数据库

9e344eb297161d12d4f3a74a00dbc4efd75.jpge7ebc4a48ed4e486d594688f9a322ab3647.jpg3ec86b4cc60f401e924c681b5df6673fbe0.jpg有主键

打印05ac9ff285bfd4e5dd64fe7d89c4c359505.jpg,其实是无序的,偶尔有序,可以重复

 

4.map

Student4.java

package com.java.model;

import java.util.Map;;

public class Student4 {
	private String name;
	private long id;
	//键值对形式
	private Map<String,String> images;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	public Map<String, String> getImages() {
		return images;
	}
	public void setImages(Map<String, String> images) {
		this.images = images;
	}

	
}

Student4.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">
<!-- 要写package="com.java.model" -->
<hibernate-mapping package="com.java.model">
      <class name="Student4" table="t_student">
		<id name="id" column="stuId">
			<generator class="native"></generator>
		</id>
		
		<property name="name" column="stuName"></property>
				
		<map name="images" table="t_image4">
		<!-- 外键 -->
			<key column="studentId"></key>
			<!-- 键值对形式-->
			<map-key column="imageKey" type="string"></map-key>
			<element column="imageName" type="string"></element>
		</map>
		
	</class>

</hibernate-mapping>

hibernate.cfg.xml

    <mapping resource="com/java/model/Student4.hbm.xml"/>

StudentTest.java

@Test
	public void testMapSave(){
		Map<String,String> imageMap=new HashMap<String,String>();
		imageMap.put("i1", "image1.png");
		imageMap.put("i2", "image2.png");
		imageMap.put("i3", "image3.png");
		imageMap.put("i4", "image4.png");
		
		Student4 s4=new Student4();
		s4.setName("赵六Map");
		s4.setImages(imageMap);
		session.save(s4);
	}
	
	@Test
	public void testMapFetch(){
		Student4 student4=(Student4)session.get(Student4.class, Long.valueOf(4));
		Map<String,String> imageMap=student4.getImages();
                //获取keys
		Set keys=imageMap.keySet();
		Iterator it=keys.iterator();
		while(it.hasNext()){
			String key=(String)it.next();
			System.out.println(key+":"+imageMap.get(key));
		}
	}
	

数据库

d44dbccd7ebb58604947aa66129f37b592a.jpg93e83a65d8739473a689e9396b5e9fa8709.jpg7828d6fad21f40e527086f090edb3331e8c.jpg

 

转载于:https://my.oschina.net/u/3848699/blog/2240085

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值