Hibernate学习笔记(六)使用jpa annotation标注实体

  • 添加jpa annotation支持
  • Annotation?还是XML映射文件


添加jpa annotation支持:
从JDK1.5之后,Java增加了Annotation的支持。Hibernate使用的Annotation是jpa制定的规范,不论是对Hibernate还是对jpa以及其他的ORM框架都适用,这是使用Annotation的好处之一。JPA规范推荐使用Annotation来管理实体类和数据表之间的映射关系,这样可以避免了一个实体需要同时维护两份文件(Java类和XML映射文件),实体类的Java代码已经映射信息都集中在一份文件中。
PO=POJO+@Annotation

实例如下:
持久化类Person:使用@Entity表示持久化类,@EmbeddedId表示标识主键,@Embedded用来映射属性为组件类型的。
package org.crazyit.app.domain;

import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table;

@Entity
@Table(name="person_table")
public class Person {

	@EmbeddedId
	@AttributeOverrides({
		@AttributeOverride(name="first" ,column=@Column(name="person_first")),
		@AttributeOverride(name="last" ,column=@Column(name="person_last" ,length=20))
	})
	private Name name;
	@Column(name="person_email",length=20)
	private String email;
	@Embedded
	@AttributeOverrides({
		@AttributeOverride(name="name" ,column=@Column(name="cat_name" ,length=20)),
		@AttributeOverride(name="color" ,column=@Column(name="cat_color"))
	})
	private Cat cat;
	public Name getName() {
		return name;
	}
	public void setName(Name name) {
		this.name = name;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public Cat getCat() {
		return cat;
	}
	public void setCat(Cat cat) {
		this.cat = cat;
	}
}
标识组件类中加上@Enbeddable,且实现Serializable接口和重写equals和hashCode方法
@Embeddable
public class Name implements Serializable{

	private String first;
	private String last;
	public Name(String string, String string2) {
		this.first=string;
		this.last = string2;
	}
	public Name() {
	}
	public String getFirst() {
		return first;
	}
	public void setFirst(String first) {
		this.first = first;
	}
	public String getLast() {
		return last;
	}
	public void setLast(String last) {
		this.last = last;
	}
	//重写equals方法,根据first、last进行判断
	public boolean equals(Object obj)
	{
		if (this == obj)
		{
			return true;
		}
		if (obj != null 
			&& obj.getClass() == Name.class)
		{
			Name target = (Name)obj;
			if (target.getFirst().equals(getFirst())
				&& target.getLast().equals(getLast()))
			{
				return true;
			}
		}
		return false;
	}

	//重写hashCode方法,根据first、last计算hashCode值
	public int hashCode()
	{
		return getFirst().hashCode() * 13 
			+ getLast().hashCode();
	}
}
普通组件类中加上@Enbeddable
@Embeddable
public class Cat {

	private String name;
	private String color;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	public Cat(String name, String color) {
		this.name = name;
		this.color = color;
	}
	public Cat() {
	}
}
在配置文件中添加<mapping class="" />
<session-factory>
        <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">phpwind.net</property>
       
		<property name="hibernate.c3p0.max_size">20</property>
		<property name="hibernate.c3p0.min_size">1</property>
		<property name="hibernate.c3p0.timeout">5000</property>
		<property name="hibernate.c3p0.max_statements">100</property>
		<property name="hibernate.c3p0.idle_test_period">3000</property>
		<property name="hibernate.c3p0.acquire_increment">2</property>
        <property name="hibernate.c3p0.validate">true</property>
        
        <property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
        <property name="show_sql">true</property>
        <property name="format_sql">false</property>
        <property name="hbm2ddl.auto">update</property>
        <property name="use_sql_comments">true</property>
        <!-- 
        <mapping resource="org/crazyit/app/domain/Person.hbm.xml"/>
         -->
         <mapping class="org.crazyit.app.domain.Person"/>
    </session-factory>
测试类:
public class PersonManager {
	public static void main(String[] args) {
		Session sess = MyHibernateUtil.currSession();
		Transaction tx = sess.beginTransaction();
		Person rmd = new Person();
		Name name = new Name();
		name.setFirst("first1");
		name.setLast("last2");
		rmd.setName(name);
		Cat cat = new Cat("bluecat","blue");
		rmd.setCat(cat);
		rmd.setEmail("1031568262@qq.com");
		sess.save(rmd);
		
		tx.commit();
		
		MyHibernateUtil.closeSession();
	}
}
运行结果如下:
INFO: HHH000232: Schema update complete
Hibernate: /* insert org.crazyit.app.domain.Person */ insert into person_table (cat_color, cat_name, person_email, person_first, person_last) values (?, ?, ?, ?, ?)

如图所示:表的主键为Name组件的first 和last属性



1、持久化类需要添加的@Annotation
@Entity用于标注该类是一个持久化类。
@EmbeddedId用于标注复合类型的标识属性。
@Embedded用于标注一个组件属性。
可选的Annotation
@Column(name="table_column" ,length=20)用于指定属性对应列名和长度。
@AttributeOverrides({
     @AttributeOverride(name="name1", column=@Column(name="table_column1",length=20)),
     @AttributeOverride(name="name2", column=@Column(name="table_column2",length=20)),
})
上面的@AttributeOverrides和@AttributeOverride用于指定标识属性类和组件属性类对应列的列名和长度。

2、组件类需要添加的@Annotation
@Embeddable用于标注标识属性类和组件属性类。

3、标识属性类需要实现java.io.Serizlizable接口和重写equals()和hashCode()方法。
在hibernate.cfg.xml文件中,在<session-factory../>元素下添加子元素<mapping class="x.x.ABC" />来添加映射类。


Annotation?还是XML映射文件:
实际开发中,早期的Hibernate使用者大都习惯使用*.hbm.xml文件来管理映射关系,因此*.hbm.xml文件在实际企业开发中占用比较重要的地位。
对于新项目,推荐使用Annotation,主要有如下两个理由:
使用Annotation更加简洁,开发者可以将实体类的Java代码和Annotation集中在一个文件中管理,因此更加简单。
基于Annotation的实体具有更好的保值性。因为这些Annotation并不属于Hibernate,而是属于JPA规范,因此这些实体类不仅对于Hibernate可用,对于JPA也是用的。如果迁移到其他ORM框架上,底层实体类无须做任何改变。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值