`
jaesonchen
  • 浏览: 310042 次
  • 来自: ...
社区版块
存档分类
最新评论

hibernate映射配置Annotation方式

 
阅读更多
import java.util.HashSet;
import java.util.Set;
import javax.persistence.*;
import org.hibernate.annotations.GenericGenerator;

 

@Entity
@Table(name = "department", catalog = "db4myeclipse")
public class Department implements java.io.Serializable {

	private static final long serialVersionUID = 1L;
	private String id;
	private String deptName;
	private Department parentDept;
	private Set<User> users = new HashSet<User>(0);
	private Set<Department> childDepts = new HashSet<Department>(0);

	public Department() {
	}
	public Department(String id, String deptName) {
		this.id = id;
		this.deptName = deptName;
	}

	@GenericGenerator(name = "idGenerator", strategy = "assigned")
	@Id
	@GeneratedValue(generator = "idGenerator")
	@Column(name = "id", unique = true, nullable = false)
	public String getId() {
		return this.id;
	}

	public void setId(String id) {
		this.id = id;
	}

	@ManyToOne
	@JoinColumn(name = "parent_id")
	public Department getParentDept() {
		return this.parentDept;
	}

	public void setParentDept(Department parentDept) {
		this.parentDept = parentDept;
	}

	@Column(name = "deptName", nullable = false, length = 32)
	public String getDeptName() {
		return this.deptName;
	}

	public void setDeptName(String deptName) {
		this.deptName = deptName;
	}

	@OneToMany(mappedBy = "department")
	public Set<User> getUsers() {
		return this.users;
	}

	public void setUsers(Set<User> users) {
		this.users = users;
	}

	@OneToMany(mappedBy = "parentDept")
	public Set<Department> getChildDepts() {
		return this.childDepts;
	}

	public void setChildDepts(Set<Department> childDepts) {
		this.childDepts = childDepts;
	}

}

 

@Entity
@Table(name = "idcard", catalog = "db4myeclipse")
public class IdCard implements java.io.Serializable {

	private static final long serialVersionUID = 1L;
	private String id;
	private String cardNo;
	private Timestamp authDate;
	private User user;
	public IdCard() {
	}

	public IdCard(String cardNo, Timestamp authDate, User user) {
		this.cardNo = cardNo;
		this.authDate = authDate;
		this.user = user;
	}

	@GenericGenerator(name = "idGenerator", strategy = "uuid")
	@Id
	@GeneratedValue(generator = "idGenerator")
	@Column(name = "id", unique = true, nullable = false)
	public String getId() {
		return this.id;
	}

	public void setId(String id) {
		this.id = id;
	}

	@Column(name = "cardNo", nullable = false, length = 32)
	public String getCardNo() {
		return this.cardNo;
	}

	public void setCardNo(String cardNo) {
		this.cardNo = cardNo;
	}

	@Column(name = "authDate", nullable = false)
	public Timestamp getAuthDate() {
		return this.authDate;
	}

	public void setAuthDate(Timestamp authDate) {
		this.authDate = authDate;
	}
	
	@OneToOne(mappedBy = "idCard")
	public User getUser() {
		return this.user;
	}

	public void setUser(User user) {
		this.user = user;
	}
}

 

@Entity
@Table(name = "role", catalog = "db4myeclipse")
public class Role implements java.io.Serializable {

	private static final long serialVersionUID = 1L;
	private Integer id;
	private String roleName;
	private String roleDesc;
	private Set<User> users = new HashSet<User>(0);
	public Role() {
	}

	public Role(String roleName) {
		this.roleName = roleName;
	}
	public Role(String roleName, String roleDesc, Set<User> users) {
		this.roleName = roleName;
		this.roleDesc = roleDesc;
		this.users = users;
	}

	@GenericGenerator(name = "idGenerator", strategy = "native")
	@Id
	@GeneratedValue(generator = "idGenerator")
	@Column(name = "id", unique = true, nullable = false)
	public Integer getId() {
		return this.id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	@Column(name = "roleName", nullable = false, length = 32)
	public String getRoleName() {
		return this.roleName;
	}

	public void setRoleName(String roleName) {
		this.roleName = roleName;
	}

	@Column(name = "roleDesc", length = 128)
	public String getRoleDesc() {
		return this.roleDesc;
	}

	public void setRoleDesc(String roleDesc) {
		this.roleDesc = roleDesc;
	}

	@ManyToMany(
			targetEntity = com.jaeson.hibernatestudy.bean.User.class,
			mappedBy = "roles")
	public Set<User> getUsers() {
		return this.users;
	}

	public void setUsers(Set<User> users) {
		this.users = users;
	}
 
}

 

@Entity
@Table(name = "user", catalog = "db4myeclipse")
public class User implements java.io.Serializable {

	private static final long serialVersionUID = 1L;
	private String id;
	private IdCard idCard;
	private Department department;
	private String userName;
	private Address address;
	private Set<Role> roles = new HashSet<Role>(0);
	public User() {
	}

	public User(String userName, Address address) {
		this.userName = userName;
		this.address = address;
	}

	@GenericGenerator(name = "idGenerator", strategy = "uuid")
	@Id
	@GeneratedValue(generator = "idGenerator")
	@Column(name = "id", unique = true, nullable = false)
	public String getId() {
		return this.id;
	}

	public void setId(String id) {
		this.id = id;
	}

	@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
	@JoinColumn(name="card_id", unique=true)
	public IdCard getIdCard() {
		return this.idCard;
	}

	public void setIdCard(IdCard idCard) {
		this.idCard = idCard;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "dept_id")
	public Department getDepartment() {
		return this.department;
	}

	public void setDepartment(Department department) {
		this.department = department;
	}

	@Column(name = "userName", nullable = false, length = 32)
	public String getUserName() {
		return this.userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	@Embedded
	@AttributeOverrides({
		@AttributeOverride(name="address",	column = @Column(name="address") ),
		@AttributeOverride(name="zipCode",	column = @Column(name="zipCode") ),
		@AttributeOverride(name="phone", 	column = @Column(name="phone") ),
		})
	public Address getAddress() {
		return this.address;
	}

	public void setAddress(Address address) {
		this.address = address;
	}
 
	@ManyToMany(
			targetEntity=com.jaeson.hibernatestudy.bean.Role.class,
			cascade=CascadeType.ALL)
	@JoinTable(
			name="user_role",
			joinColumns=@JoinColumn(name="user_id"),
			inverseJoinColumns=@JoinColumn(name="role_id")
			)
	public Set<Role> getRoles() {
		return this.roles;
	}

	public void setRoles(Set<Role> roles) {
		this.roles = roles;
	}
}
@Embeddable
public class Address implements Serializable {
 
	private static final long serialVersionUID = 1L;
	private String address;
	private Integer zipCode;
	private String phone;
 
	public Address() {}
 
	public Address(String address, Integer zipCode, String phone) {
		this.address = address;
		this.zipCode = zipCode;
		this.phone = phone;
	}
 
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public Integer getZipCode() {
		return zipCode;
	}
	public void setZipCode(Integer zipCode) {
 		this.zipCode = zipCode;
	}
	public String getPhone() {
 		return phone;
	}
	public void setPhone(String phone) {
 		this.phone = phone;
	}
}

 

 * 默认情况下hbm文件中的声明比类中的注解元数据具有更高的优先级。

 

 * hibernate使用javax.persistence.*定义的持久化注解


 * @Entity注解将一个类声明为一个实体bean(即一个持久化POJO类)
 * @Id注解则声明了该实体bean的标识属性.
 * 其他的映射定义是隐式的.这种以隐式映射为主体,以显式映射为例外的配置方式在新的EJ3规范中处于非常

   重要的位置.
 * 在对一个类进行注解时,你可以选择对它的的属性或者方法进行注解,根据你的选择,Hibernate的访问类型

   分别为 field或property.

 * @Table是类一级的注解, 通过@Table注解可以为实体bean映射指定表(table),目录(catalog)和schema的

   名字.
   如果没有定义@Table,那么系统自动使用默认值:实体的短类名(不附带包名).
   @Table元素包括了一个schema 和一个 catalog属性,如果需要可以指定相应的值. 
 
 * @Id注解可以将实体bean中的某个属性定义为标识符(identifier). 该属性的值可以通过应用自身进行设置,

   也可以通过Hiberante生成(推荐).
   使用 @GeneratedValue注解可以定义该标识符的生成策略: 
    strategy 指定生成的策略,默认是GenerationType.AUTO
    generator 指定生成主键使用的生成器
    • AUTO  - 可以是identity column类型,或者sequence类型或者table类型,取决于不同的底层数据库.
    • TABLE  - 使用表保存id值 
    • IDENTITY - 主键由数据库自动生成,主要是自动增长类型
    • SEQUENCE - sequence
   @org.hibernate.annotations.GenericGenerator 允许你定义一个Hibernate特定的id生成器.
   @GenericGenerator(name="generator", strategy = "uuid")
   @Id
   @GeneratedValue(generator="generator")
   @Column(name = "id", unique = true, nullable = false)

 * @Basic所有没有定义注解的属性等价于在其上面添加了@Basic注解. 通过 @Basic注解可以声明属性的

   获取策略(fetch strategy),FetchType.LAZY 或者 FetchType.EAGER.
 
 * @Column 注解可将属性映射到列.
   @Column(
        name="columnName";
        boolean unique() default false; 
        boolean nullable() default true;
        int length() default 255)

 *  组件映射:
    组件类必须在类一级定义@Embeddable注解. 在特定的实体的关联属性上使用@Embedded和 

    @AttributeOverride注解可以覆盖该属性对应的嵌入式对象的列映射:
    @Embedded
    @AttributeOverrides( {
        @AttributeOverride(name="address", column = @Column(name="address") ),
        @AttributeOverride(name="zipCode", column = @Column(name="zipCode") ),
        @AttributeOverride(name="phone",  column = @Column(name="phone") ),
    })

 * cascade:级联,它可以有有五个值可选,分别是:
    CascadeType.PERSIST:级联新建

    CascadeType.MERGE  :级联更新
    CascadeType.REMOVE : 级联删除
    CascadeType.REFRESH:级联刷新

    CascadeType.ALL:以上全部四项

 * @OneToOne唯一外键关联:一对一关联可能是双向的.在双向关联中, 有且仅有一端是作为主体(owner)端

    存在的:主体端负责维护联接列(即更新). 
    对于不需要维护这种关系的从表则通过mappedBy属性进行声明.mappedBy的值指向主体的关联属性. 
    注释五个属性:targetEntity、cascade、fetch、optional 和mappedBy,
    fetch属性默认值是FetchType.EAGER。
    optional = true设置外键属性可以为null
    targetEntity属性:Class类型的属性。定义关系类的类型,默认是该成员属性对应的类类型
    cascade属性:CascadeType[]类型。

    外键端:

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name="card_id", unique=true)
    主键端:

    @OneToOne(mappedBy = "idCard")

 * @Many-to-one:@JoinColumn是可选的,关联字段默认值为:主体的关联属性名+下划线+被关联端的

    主键列名. 
    fetch属性默认值是FetchType.EAGER。
    多端:

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="dept_id")

 *  @One-to-many:在EJB3规范中多对一这端几乎总是双向关联中的主体(owner)端, 而一对多这端的关联

     注解为:

     @OneToMany(mappedBy="department")
     fetch属性默认值是FetchType.LAZY。


 *  @Many-to-many:通过@ManyToMany注解可定义的多对多关联. 同时,你也需要通过注解@JoinTable

     描述关联表和关联条件. 如果是双向关联,其中一段必须定义为owner,另一端必须定义为inverse
     fetch属性默认值是FetchType.LAZY。
     @ManyToMany(
          targetEntity=com.jaeson.hibernatestudy.bean.Role.class,
          cascade={CascadeType.PERSIST, CascadeType.MERGE})
     @JoinTable(
          name="user_role",
          joinColumns=@JoinColumn(name="user_id"),
          inverseJoinColumns=@JoinColumn(name="role_id"))
    

     @ManyToMany(
          mappedBy = "roles",
          targetEntity = com.jaeson.hibernatestudy.bean.User.class)

 

分享到:
评论

相关推荐

    Hibernate distribution and annotation

    2. **映射机制**: Hibernate支持XML映射文件(hbm.xml)和注解映射两种方式,让对象与数据库表之间建立映射关系。 3. **Session和Transaction**: Session是Hibernate的主要工作单元,负责保存、更新和检索对象。...

    Hibernate继承映射(annotation)

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

    Hibernate组件映射(annotation/xml)

    本文将深入探讨Hibernate中的组件映射,包括使用注解(Annotation)和XML配置两种方式,以帮助开发者更好地理解和应用这一功能。 一、Hibernate组件映射基础 组件映射是Hibernate中的一种特性,允许我们将一个类的...

    Hibernate Annotation jar

    已经不用*.hbm.xml这种映射文件了,都是用Annotation(注解)方式来完成实体与表之间的映射关系,这样看起来比用xml文件来映射更具有可读性,自我感觉以后Hibernate Annotation的映射方式将代替hibernate 的*.hbm....

    让Hibernate同时支持xml和注解两种映射方式

    Spring提供了`LocalSessionFactoryBean`用于配置基于XML的Hibernate映射,而`AnnotationSessionFactoryBean`则用于处理基于注解的映射。这两个类分别处理不同的映射方式,所以默认情况下,它们不能直接共存于同一个...

    springmvc + hibernate annotation 配置

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

    hibernate中文APIhibernate annotation 中文API

    Hibernate Annotation则是Hibernate的一部分,它引入了Java注解,使得配置更加简洁,无需XML文件即可进行对象持久化。 **Hibernate API详解:** Hibernate API提供了对数据库操作的各种接口和类,包括Session、...

    spring3+hibernate4配置声明式事务管理(annotation方式)

    在Spring和Hibernate中,注解常用于配置和简化框架的使用,例如在类和方法上使用`@Transactional`进行事务管理,或使用`@Entity`、`@Table`等定义实体和表映射。 4. **声明式事务管理**:与编程式事务管理相比,...

    hibernate-Annotation.jar

    在Hibernate 3.x版本中,引入了Annotation注解,这是一种元数据的方式,可以替代XML配置文件来描述对象与数据库表之间的映射关系。 **Hibernate Annotation注解** 在Hibernate 3.x之前,对象到数据库的映射通常...

    Struts2+Spring2+Hibernate3+Annotation所需JAR包

    ### Struts2+Spring2+Hibernate3+Annotation所需JAR包详解 在Java Web开发领域,Struts2、Spring2和Hibernate3是三个非常重要的框架,它们分别负责Web层、业务逻辑层和服务持久化层的功能实现。为了更好地整合这三...

    spring3、 hibernate4 配置声明式事务管理(annotation方式)

    本篇将详细介绍如何在Spring 3和Hibernate 4中配置声明式事务管理,采用注解方式。 一、Spring的事务管理 Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理需要在代码中显式地调用...

    hibernate-annotation

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

    SpringMVC Spring Hibernate 框架整合 Annotation Maven Project

    Hibernate是Java领域最流行的ORM框架之一,它将Java对象与数据库表进行映射,通过对象的方式来操作数据库。Hibernate提供了一套强大的API,包括Session、SessionFactory、Query等,使得开发者可以进行CRUD(创建、...

    Hibernate Annotation 中文文档

    随着技术的发展,Hibernate Annotation逐渐成为主流,因为它提供了更直观、更简洁的方式来映射对象关系模型(ORM)。这篇文档主要讨论的是Hibernate Annotation的使用方法,以及它如何替代传统的XML配置文件(*.hbm....

    hibernate annotation hibernate3

    在Java开发领域,Hibernate作为一种强大的对象关系映射(ORM)框架,极大地简化了数据库操作。本篇将深入探讨Hibernate 3版本中的注解使用,帮助开发者理解如何利用注解进行数据持久化,提高开发效率。 一、...

    详解Hibernate一对一映射配置

    **二、注解方式配置(Annotation)** 1. **主键关联** 使用注解配置主键关联,可以如下所示: ```java @Entity public class Person { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id;...

    hibernate-annotation-helloword

    **hibernate-annotation-helloworld** 是一个基于Hibernate框架,使用注解方式实现的Hello World示例项目。在Java世界中,Hibernate是一个流行的持久层框架,它极大地简化了数据库操作,尤其是在对象关系映射(ORM)...

    hibernate-annotation 所需要的jar包

    3. **Hibernate Annotation**: Hibernate的注解是在Java类和属性上添加元数据的方式,它替代了传统的Hibernate XML配置文件。通过注解,可以在实体类和属性上直接定义数据库映射,如@Entity表示一个数据库表,@Table...

Global site tag (gtag.js) - Google Analytics