`

016_hibernate基础配置(重点)+017_Annotation字段映射位置

 
阅读更多

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

 

8.1在使用注解的实体类

//表名和类名不同,对表名进行配置;使用Table注解

@Table(name = "_teacher")  //name后的为数据库中对应的表名

public class Teacher {}

 

执行TestCase时,console的语句

 insert 

    into

        _teacher

        (name, title, id) 

    values

        (?, ?, ?)

 

数据库中会出现_teacher,进行对表的操作。

 

8.2在使用配置文件时,/hibernate_0100_HelloWorld/src/com/zhuhw/hibernate/model/Student.hbm.xml

 

只要加上table属性对应的数据库中表的名称

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

 

代码案例:

 

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC

        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

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

<!-- 找不到entity,是因为这个类没改包名 -->

<hibernate-mapping package="com.zhuhw.hibernate.model">

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

<!-- id主键;name=id对应的是Student中的getid() -->

<id name="id"  ></id>

<property name="name" />

<property name="age" />

<!-- hibernater知道了怎么将class与表中的字段对应到一起了 -->

</class>

</hibernate-mapping>

 

出现的问题:

An AnnotationConfiguration instance is required to use <mapping class="com.zhuhw.hibernate.model.Teacher"/>

 

使用Configuration cf = new AnnotationConfiguration();  

 

Configuration类只支持xml配置方式,AnnotationConfiguration扩展了Configuration类,同时支持xml配置和注解方式。

 

 

 

 

 

老师的价值就在项目上,在综合运用上。

从老美的认为:

1.查的能力

2.综合运用的能力

 

查询E:\zhuhw\hibernate\jar\hibernate-annotations-3.4.0.GA\doc\reference\zh_cn\html_single文档

 

 

用JPA的标准的

 

9.字段名和属性相同

a)默认为@Basic

b)xml中不用写column

例如:

@Basic //对数据库中,字段名和属性相同

public void setId(int id) {

this.id = id;

}

 

10.字段名属性不同

a)Annotation:@Column  (直接写在get方法上)

b)xml:自己查询

 

注解方式代码案例:

/hibernate_0100_HelloWorld/src/com/zhuhw/hibernate/model/Teacher.java

 

//字段名属性不同a)Annotation:@Column

@Column(name = "_name")

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

 

 

执行结果:

console:

 insert 

    into

        _teacher

        (_name, title, id) 

    values

        (?, ?, ?)

 

数据库:增加_name与setName()对应。

 

xml方式,/hibernate_0100_HelloWorld/src/com/zhuhw/hibernate/model/Student.hbm.xml

 

 

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

 

需要Hibernate API 中文版啊

 

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC

        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

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

<!-- 找不到entity,是因为这个类没改包名 -->

<hibernate-mapping package="com.zhuhw.hibernate.model">

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

<!-- id主键;name=id对应的是Student中的getid() -->

<id name="id"  ></id>

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

<property name="age" />

<!-- hibernater知道了怎么将class与表中的字段对应到一起了 -->

</class>

</hibernate-mapping>

 

 

11.不需要persistence的字段

a)Annotation:@Transient

b)xml:不写就好了(/hibernate_0100_HelloWorld/src/com/zhuhw/hibernate/model/Student.hbm.xml)

   <property name="age" />不写

 

不要存到数据库中,

@Transient存储的时候把我当透明人就行了,不需要加到数据库中(就存到内存里就行了)

 

 

代码案例:

/hibernate_0100_HelloWorld/src/com/zhuhw/hibernate/model/Teacher.java

 

private String yourWifeName;

//不要存到数据库中

@Transient

public String getYourWifeName() {

return yourWifeName;

}

public void setYourWifeName(String yourWifeName) {

this.yourWifeName = yourWifeName;

}

 

 

 

12.映射日期与时间类型,指定时间精度

a)Annotation:@Temporal

b)xml:指定type

 

 

代码案例:

//映射日期与时间类型,指定时间精度

//通过@Temporal可以指定时间的精度

@Temporal(value=TemporalType.DATE)

public Date getBirthdate() {

return birthdate;

}

public void setBirthdate(Date birthdate) {

this.birthdate = birthdate;

}

 

正常的运行结果:

  insert 

    into

        _teacher

        (birthdate, _name, title, yourWifeName, id) 

    values

        (?, ?, ?, ?, ?)

 

 

    insert 

    into

        _teacher

        (date, _name, title, yourWifeName, id) 

    values

        (?, ?, ?, ?, ?)

 

把日期和时间都存起来了

 

 

@Temporal  //通过@Temporal可以指定时间的精度

 

这里存在问题....

-----是没有按比如只有日期显示/时间显示

 

求解:

  我错了

....写成Date date;关键字重复了...  所以木有生效呢

换下变量名称就ok了

2016-01-01

 

 

13.映射枚举类型

a)@Enumerared

b)xml:麻烦

 

数据库:

1.数据库存储String

 

/*@Enumerated(EnumType.STRING)

`zhicheng` varchar(255) DEFAULT NULL,*/

@Enumerated(EnumType.STRING)

A

 

2.数据库存储下标值

/*@Enumerated(EnumType.ORDINAL)

* 数据库存储下标值

`zhicheng` varchar(255) DEFAULT NULL,*/

@Enumerated(EnumType.ORDINAL)

 

 

 

生成一个enum类,

package com.zhuhw.hibernate.model;

 

public enum ZhiCheng {

A,B,C;

}

在/hibernate_0100_HelloWorld/src/com/zhuhw/hibernate/model/Teacher.java,

使用

//ZhiCheng   enum

private ZhiCheng zhicheng;

public ZhiCheng getZhicheng() {

return zhicheng;

}

public void setZhicheng(ZhiCheng zhicheng) {

this.zhicheng = zhicheng;

}

 

14.字段映射的位置(field或者get方法)

a)best practice:保持gfield和 get set方法一致

15.@Lob

16.课外:CLOB BLOB类型的数据存储

17.课外:hibernate自定义数据类型

18.hibernate类型

 

 

 

 

在95%以上的没必要指定类型

由hibernate自动默认帮我们实现就好了。

 

 

本章节完整代码:

 

 

package com.zhuhw.hibernate.model;

import java.util.Date;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

/*1.实体类(使用annotation进行实现,告诉hibernate是实体类,
 * 不需要再建立Teacher.hbm.xml文件进行映射)
 * 2.hibernate.cfg.xml进行配置即可
 * 3.建立一个TeacherTest
*/
@Entity

//表名和类名不同,对表名进行配置
@Table(name = "_teacher")
public class Teacher {
		private int id;
		private String name;
		private String title;
		private Date birthdate;
		//ZhiCheng   enum
		private ZhiCheng zhicheng;
		/*@Enumerated(EnumType.STRING)
		 * 数据库存储String
		`zhicheng` varchar(255) DEFAULT NULL,
		*/
		
		/*@Enumerated(EnumType.ORDINAL)
		 * 数据库存储下标值
		`zhicheng` varchar(255) DEFAULT NULL,*/
		@Enumerated(EnumType.ORDINAL)
		public ZhiCheng getZhicheng() {
			return zhicheng;
		}
		public void setZhicheng(ZhiCheng zhicheng) {
			this.zhicheng = zhicheng;
		}
		//映射日期与时间类型,指定时间精度
		//通过@Temporal可以指定时间的精度
		@Temporal(value=TemporalType.DATE)
		public Date getBirthdate() {
			return birthdate;
		}
		public void setBirthdate(Date birthdate) {
			this.birthdate = birthdate;
		}
		
		private String yourWifeName;
		//不要存到数据库中
		/*@Transient*/
		public String getYourWifeName() {
			return yourWifeName;
		}
		public void setYourWifeName(String yourWifeName) {
			this.yourWifeName = yourWifeName;
		}
		//主键
		@Id
		public int getId() {
			return id;
		}
		@Basic//对数据库中,字段名和属性相同
		public void setId(int id) {
			this.id = id;
		}
		
		//字段名属性不同a)Annotation:@Column
		@Column(name = "_name")
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
		public String getTitle() {
			return title;
		}
		public void setTitle(String title) {
			this.title = title;
		}
	
		
}

 

 

 

 

/hibernate_0100_HelloWorld/test/com/zhuhw/hibernate/model/TeacherTest.java

Junit Test Case

 

 

package com.zhuhw.hibernate.model;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;


public class TeacherTest {
	/*这个类TeacherTest一进来就被初始化了,在测试方法执行用已经初始化好的SessionFactory;
	 * 只初始化一次*/
	
	public static SessionFactory sf = null;
	@BeforeClass
	public  static void beforeClass(){
		/*关于junit会出现吞掉bug,1.可以在下面的语句上加上try catch
		 * 2.或者加个main()方法,在main里面进行调用 beforeClass()*/
			sf = new AnnotationConfiguration().configure().buildSessionFactory();
	}
	
	@Test
	public void TestTeacherSave(){
		Teacher t = new Teacher();
		t.setId(14);
		t.setName("zhuhw14");
		t.setTitle("ccc14");
		t.setBirthdate(new Date());
		t.setYourWifeName("yourWifeName14");
		t.setZhicheng(ZhiCheng.A);
		
		//因为使用的annotation,所以Configuration要使用AnnotationConfiguration
		
		/*Configuration cf = new AnnotationConfiguration();
		SessionFactory sf = cf.configure().buildSessionFactory();*/
		Session session = sf.openSession();
		//在hibernate中执行操作要在一个事务里面
		session.beginTransaction();
		session.save(t);
		session.getTransaction().commit();
		session.close();
	}
	
	/*关于junit会出现吞掉bug,1.可以在下面的语句上加上try catch
	 * 2.或者加个main()方法,在main里面进行调用 beforeClass()*/
	public void main() {
		beforeClass();
	}
	
	@AfterClass
	public static void afterClass(){
		sf.close();
	}
}

 

 

 

/hibernate_0100_HelloWorld/src/hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost/hibernate</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>

        <!-- JDBC connection pool (use the built-in) -->
        <!--<property name="connection.pool_size">1</property>-->

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- Enable Hibernate's automatic session context management -->
        <!--<property name="current_session_context_class">thread</property>-->

        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">update</property>
      
        <mapping resource="com/zhuhw/hibernate/model/Student.hbm.xml"/>

	    <mapping class="com.zhuhw.hibernate.model.Teacher"/>  
    </session-factory>

</hibernate-configuration>

 

 

/hibernate_0100_HelloWorld/src/com/zhuhw/hibernate/model/Student.java

package com.zhuhw.hibernate.model;

public class Student {
		private int id;
		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 int getAge() {
			return age;
		}
		public void setAge(int age) {
			this.age = age;
		}
		private String name;
		private int age;
}

 

 

 

/hibernate_0100_HelloWorld/src/com/zhuhw/hibernate/model/StudentTest.java

 

 

 

package com.zhuhw.hibernate.model;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;

public class StudentTest {
	public static void main(String[] args){
		Student s = new Student();
		s.setId(9);
		s.setName("yuzhou9");
		s.setAge(9);
		
		Configuration cf = new AnnotationConfiguration();  
        SessionFactory sf = cf.configure().buildSessionFactory();  
        Session session = sf.openSession();  
        //在hibernate中执行操作要在一个事务里面  
        session.beginTransaction();  
        session.save(s);  
        session.getTransaction().commit();  
        session.close();  
        sf.close();  
	}
}

 

/hibernate_0100_HelloWorld/src/com/zhuhw/hibernate/model/Student.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 找不到entity,是因为这个类没改包名 -->
<hibernate-mapping package="com.zhuhw.hibernate.model">
	<class name="Student" table="_student">
	<!-- id主键;name=id对应的是Student中的getid() -->
		<id name="id"  ></id>
		<property name="name" column="_name" />
		<property name="age" />
		<!-- hibernater知道了怎么将class与表中的字段对应到一起了 -->
	</class>
</hibernate-mapping>

 

 

 

package com.zhuhw.hibernate.model;

public enum ZhiCheng {
	A,B,C;
}


/hibernate_0100_HelloWorld/src/log4j.properties

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file hibernate.log ###
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=hibernate.log
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=warn, stdout

#log4j.logger.org.hibernate=info
log4j.logger.org.hibernate=debug

### log HQL query parser activity
#log4j.logger.org.hibernate.hql.ast.AST=debug

### log just the SQL
#log4j.logger.org.hibernate.SQL=debug

### log JDBC bind parameters ###

log4j.logger.org.hibernate.type=info
#log4j.logger.org.hibernate.type=debug

### log schema export/update ###
log4j.logger.org.hibernate.tool.hbm2ddl=debug

### log HQL parse trees
#log4j.logger.org.hibernate.hql=debug

### log cache activity ###
#log4j.logger.org.hibernate.cache=debug

### log transaction activity
#log4j.logger.org.hibernate.transaction=debug

### log JDBC resource acquisition
#log4j.logger.org.hibernate.jdbc=debug

### enable the following line if you want to track down connection ###
### leakages when using DriverManagerConnectionProvider ###
#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace

 

0
0
分享到:
评论

相关推荐

    Struts2+Spring2.5+Hibernate3+annotation 整合程序

    在整合中,Hibernate负责数据持久化,通过注解配置,可以直接在实体类上声明字段与数据库表的对应关系,实现透明化的CRUD(创建、读取、更新、删除)操作。 4. Annotation(注解):在Java中,注解是一种元数据,...

    hibernate资料5

    在“hibernate资料5”中,我们有两个关键的学习资源:016_尚学堂马士兵_Java视频教程_Hibernate3.3.2_hibernate基础配置.avi 和 017_尚学堂马士兵_Java视频教程_Hibernate3.3.2_Annotation字段映射位置.avi。...

    Spring_Hibernate_JAVAX_Annotation注解

    5. **@Column**:用于指定字段映射到数据库表中的列。 6. **@ManyToOne/@OneToOne/@OneToMany/@ManyToMany**:这些注解用于定义实体之间的关系。 #### 四、JSR规范下的注解 1. **JSR 303/349(javax.validation...

    Hibernate中文文档+hibernate annotation +distribution

    2. 映射(Mapping):实体和数据库表之间的关系通过XML或注解进行定义,包括字段映射、关联映射等。 3. 会话(Session):它是持久化操作的入口,负责事务管理和对象状态的管理,提供了增删改查的基本操作。 4. 查询...

    hibernate-distribution 3.3.2+annotation3.4.0+slf4j-1.5.8.rar )

    1. **配置与初始化**:Hibernate 3.3.2的配置文件(通常为hibernate.cfg.xml)是项目启动的基础,包含了数据库连接信息、缓存策略、事务管理等关键设置。初始化时,会通过SessionFactory构建器加载配置,并生成...

    springmvc + hibernate annotation 配置

    在本篇文章中,我们将详细探讨如何将Spring MVC与Hibernate结合,并利用注解(Annotation)进行配置。 首先,让我们了解这两个框架的基本概念。Spring MVC是Spring框架的一部分,它是一个用于构建Web应用的模型-...

    spring_hibernate_annotation的三种实现

    Spring是一个全面的后端开发框架,提供依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)等特性,而Hibernate则是一个强大的对象关系映射(ORM)工具,简化了Java应用与数据库之间的交互。当将两者结合使用并...

    hibernate annotation hibernate3

    二、Hibernate注解基础 1. 实体类注解:`@Entity` `@Entity`注解用于标记一个Java类为数据库中的实体表,每个实例对应表中的一条记录。例如: ```java @Entity public class User { //... } ``` 2. 主键注解...

    Hibernate distribution and annotation

    1. **配置与实体管理**: Hibernate通过`hibernate.cfg.xml`配置文件来设置数据库连接、缓存策略等。同时,它使用@Entity注解标识Java类为数据库实体。 2. **映射机制**: Hibernate支持XML映射文件(hbm.xml)和...

    hibernate 中文文档 and _annotation.chm

    《Hibernate中文文档与Annotation》 Hibernate是一款开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作。Hibernate允许开发人员将Java对象模型与数据库表进行映射,从而避免了传统的JDBC...

    hibernate_annotation_中文帮助文档

    《Hibernate Annotations中文帮助文档》是针对Java开发人员的一份详细指南,主要讲解如何使用Hibernate ORM框架中的注解来实现数据库对象的映射。该文档涵盖了从基础到高级的各种概念,帮助开发者更高效地管理和操作...

    hibernate annotation 中文文档

    《Hibernate Annotation 中文文档》是Java开发者们的重要参考资料,它详细介绍了如何在Hibernate框架中使用注解进行对象关系映射(ORM)。Hibernate是一款强大的开源Java持久化框架,它简化了数据库与Java对象之间的...

    Hibernate继承映射(annotation)

    **标题:“Hibernate继承映射(Annotation)详解”** 在Java持久化框架Hibernate中,继承映射是一种关键特性,它允许开发者将对象模型的继承结构映射到数据库的表结构。在传统的面向对象编程中,继承是实现代码复用和...

    Hibernate Annotation 中文文档

    这篇文档主要讨论的是Hibernate Annotation的使用方法,以及它如何替代传统的XML配置文件(*.hbm.xml)进行对象-关系映射。 **1. Hibernate Annotation简介** Hibernate Annotation是Hibernate框架的一个扩展,它...

    最全的Hibernate Annotation API文档

    四、字段映射(Columns) 字段与数据库列的映射通过`@Column`注解实现,如指定列名、长度、是否可为空等: ```java @Entity public class User { @Id private Long id; @Column(name = "username", nullable = ...

    hibernate-Annotation.jar

    3. **字段映射注解** - `@Column`:用于指定属性与数据库表的列之间的映射关系,可以设置列名、长度、是否允许为空等属性。 - `@GeneratedValue`:用于指定主键生成策略,例如自增(IDENTITY)、序列(SEQUENCE)...

    hibernate-annotation

    而Hibernate注解则是其在ORM(对象关系映射)领域的进一步进化,它允许开发者将元数据直接嵌入到Java类和属性的声明中,从而避免了XML配置文件的繁琐。本篇将详细阐述Hibernate注解的相关知识。 一、Hibernate注解...

    Hibernate_Annotation参考文档

    - **字段映射**: - **@Column**:用于指定字段的映射属性,如名称等。 - **关联关系映射**: - **一对一映射**: - 使用`@OneToOne`注解进行一对一映射配置。 - **多对一映射**: - 使用`@ManyToOne`注解进行...

Global site tag (gtag.js) - Google Analytics