Hibernate 注解的用法以及说明(二)

注解映射必须满足两大条件:Hibernate3.2以上版本和JSEE 5。 
@Entity
类注释,所有要持久化的类都要有
@Entity   
public class
Org  implements java.io.Serializable {
   
}   
@Id
主键       
@Id   
     @GeneratedValue   
     private
String orgId;    
     private String
orgName;   
@Column(name="...")
该属性对应表中的字段是什么,没有name表示一样 
@Table 对象与表映射 
@UniqueConstraint
唯一约束 
@Version 方法和字段级,乐观锁用法,返回数字和timestamp,数字为首选 
@Transient
暂态属性,表示不需要处理 
@Basic
最基本的注释。有两个属性:fetch是否延迟加载,optional是否允许null 
@Enumerated
枚举类型 
@Temporal 日期转换。默认转换Timestamp 
@Lob
通常与@Basic同时使用,提高访问速度。 
@Embeddable 类级,表可嵌入的 
@Embedded
方法字段级,表被嵌入的对象和@Embeddable一起使用 
@AttributeOverrides
属性重写 
@AttributeOverride
属性重写的内容和@AttributeOverrides一起嵌套使用 
@SecondaryTables
多个表格映射 
@SecondaryTable
定义辅助表格映射和@SecondaryTables一起嵌套使用 
@GeneratedValue
标识符生成策略,默认Auto 
表与表关系映射 
@OneToOne:一对一映射。它包含五个属性: 
targetEntity:关联的目标类 
Cascade:持久化时的级联操作,默认没有 
fetch:获取对象的方式,默认EAGER 
Optional:目标对象是否允许为null,默认允许 
mappedBy:定义双向关联中的从属类。 
单向: 
   
@JoinColumn:定义外键(主表会多一字段,做外键) 
@OneToMany:一对多映射;@ManyToOne:多对一映射 
单向一对多: 
   
@OneToMany(cascade=CascadeType.ALL) 
   
@JoinColumn(name="book_oid")/**book:表;oid:book表的主键;无name会按此规则自动生成*/ 
单向多对一: 
   
@ManyToOne(cascade=CascadeType.ALL) 
   
@JoinColumn(name="author_oid") 
关联表格一对多: 
   
@OneToMany(cascade=CascadeType.ALL) 
   
@JoinTable(joinColumn={@JoinColumn(name="BOOK_OBJECT_OID")},inverseJoinColumns={@JoinColumn(name="AUTHER_OBJECT_OID")}) 
双向一对多或多对一: 
   
不需要多一张表,只是使用mappedBy:使用在One一方,值为One方类名表示Many的从属类。 
@Entity  
Java代码 
@Entity   
public
class Org  implements java.io.Serializable {
   
   
   
    //
Fields    
   
    @Id   
    @GeneratedValue   
     private
String orgId;    
     private String
orgName;    
     @OneToMany(mappedBy
= "org")    
     private
List<Department> departments;
   
   
    //
Constructors    
...
   
    // Property accessors
   
...    
}

@Entity  public class Org  implements java.io.Serializable {        // Fields       @Id   @GeneratedValue       private String orgId;       private String orgName;       @OneToMany(mappedBy = "org")       private List<Department> departments;        // Constructors  ...      // Property accessors  ...  }

@Entity
public class Department implements
java.io.Serializable {
    //
Fields    
@Id
@GeneratedValue
    
private String id;
     private String
name;
    
@ManyToOne(fetch=FetchType.EAGER)
    
@JoinColumn(name="org_orgId")
     private
Org org;
     @OneToMany(mappedBy =
"department")
     private
List<Employee> employees;
    //
Constructors
    public List<Employee>
getEmployees() {
return
employees;
}
public void
setEmployees(List<Employee> employees) {
this.employees =
employees;
}
public Org getOrg()
{
return org;
}
public void
setOrg(Org org) {
this.org =
org;
}
/** default constructor
*/
            
.
            
.
            
.
}
Java代码 
@Entity   
public
class Employee  implements java.io.Serializable {
   
   
   
    //
Fields    
   
    @Id   
    @GeneratedValue   
     private
String employeeId;
   
     private String
employeeName;
   
     private String
passWord;
   
     private Integer
age;    
     private
Integer sex;
   
     @ManyToOne(fetch=FetchType.EAGER)
   
     @JoinColumn(name="department_id")
   
     private
Department department;
   
   
     
   
    public Department
getDepartment() {
   
        return
department;    
     }
   
   
    public
void setDepartment(Department department) {
   
        this.department
= department;    
     }
   
   
    /**
default constructor
*/   
     ...
   
    // Property accessors
   
     ...
   
}

@Entity  public class Employee  implements java.io.Serializable {        // Fields       @Id   @GeneratedValue       private String employeeId;       private String employeeName;       private String passWord;       private Integer age;       private Integer sex;       @ManyToOne(fetch=FetchType.EAGER)       @JoinColumn(name="department_id")       private Department department;               public Department getDepartment() {    return department;   }     public void setDepartment(Department department) {    this.department = department;   }     /** default constructor */      ...      // Property accessors      ...  }

双向多对多:@ManyToMany.单向多对多这里不在赘述(没有太多实际意义) 
这个比较简单,看下代码就明白了: 
@Entity
public
class Book implements java.io.Serializable
{
@Id
private int id;
private
String name;
private float
money;
@ManyToMany(cascade =
CascadeType.ALL)
private List<Author>
authors;
public List<Author> getAuthors()
{
return authors;
}
public void
setAuthors(List<Author> authors) {
this.authors =
authors;
}
        
...
}
@Entity
public class
Author implements java.io.Serializable
{
@Id
private int id;
private
String name;
private int
age;
@ManyToMany(mappedBy="authors")
private
List<Book> books;
public List<Book> getBooks()
{
return books;
}
public void
setBooks(List<Book> books) {
this.books =
books;
}
        
...
}
基于注解的hibernate主键设置:@Id. 
那么它的生成规则是什么呢?是由@GeneratedValue来规定的。 
我们先来看看它是如何定义的: 
Java代码 
@Target({METHOD,FIELD})
   
    @Retention(RUNTIME)
   
    public @interface
GeneratedValue{
   
        
GenerationType strategy() default AUTO;
   
        
String generator() default "";
   
    
}

@Target({METHOD,FIELD})   @Retention(RUNTIME)   public @interface GeneratedValue{    GenerationType strategy() default AUTO;    String generator() default "";   }

Java代码 
public
enum GenerationType{
   
        
TABLE,
   
        
SEQUENCE,
   
        
IDENTITY,
   
        
AUTO    
    
}

public enum GenerationType{    TABLE,    SEQUENCE,    IDENTITY,    AUTO   }

现在我们看到了,它提供了4种生成策略: 
TABLE:使用一个特定的数据库表格来保存标识符序列。 
SEQUENCE:生成序列化标识符。 
IDENTITY:标识符有数据库自动生成(主要是自动增长型) 
AUTO:标识符生成工作由hibernate自动处理。实际项目开发不建议使用。 
注意:当主键为int,而数据库中又不是自动增长型时,使用@GeneratedValue是无法正常工作的。 
我们也可以使用下面的方式来自己指定我们的主键值: 
           
Java代码 
@GeneratedValue(generator
= "c-assigned")
   
    @GenericGenerator(name
= "c-assigned", strategy = "assigned")
   
     private String
employeeId;

@GeneratedValue(generator = "c-assigned")   @GenericGenerator(name = "c-assigned", strategy = "assigned")       private String employeeId;

或者直接不要定义@GeneratedValue,只定义@Id效果也是一样的。

时间: 2024-11-03 22:57:02

Hibernate 注解的用法以及说明(二)的相关文章

SHOP++ 中Hibernate 注解 用法

最近接触到一款JAVA开源软件(shop++)这是一款电商软件.然后看了这款软件的源代码,发现真的很强大.框架采用的是spring mvc + hibernate + freemarker ,代码结构层次分明,代码封装和重用性也很高.非常适合二次开发.其次重点说说hibernate 注解吧 数据库表采用的是hibernate注解映射的方式.然后略微研究了下,分享一下自己的见解. @Entity说明此类是一个实体映射 @Tabletable用来定义entity主表的name,cataloh,sch

hibernate注解

慕课网:http://www.imooc.com/learn/524 一.类级别注解 简介 使用注解的目的:为了简化繁琐的ORM映射文件(*.hbm)的配置 JPA(Java Persistence API)与hibernate的关系:JPA是标准接口,hibernate是实现(hibernate的功能是jpa的超集,功能更强大) hibernate如何实现与JPA的关系:通过hibernate-annotation.hibernate-entitymanager.hibernate-core三

Hibernate学习一:Hibernate注解CascadeType

http://zy19982004.iteye.com/blog/1721846 ———————————————————————————————————————————————————————— Hibernate学习一:Hibernate注解CascadeType 博客分类: Hibernate hibernate 一.概念 现有一场景:一个管理员可以管理多个网吧,一个网吧可以被多个管理员管理.从中抽象出一个多对多的例子user-bar. 主控方user:多对多里面里面会有第三张表user_b

(十) 使用Hibernate 注解

Hibernate里有两种注解 : Hibernate 注解 JPA注解 主键生成机制 : http://www.cnblogs.com/ph123/p/5692194.html 案例一:   用注解对非复合主键的表生成配置文件 package bean; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.p

Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(二)

在上一篇文章中我详细的介绍了如何搭建maven环境以及生成一个maven骨架的web项目,那么这章中我将讲述Spring MVC的流程结构,Spring MVC与Struts2的区别,以及例子中的一些配置文件的分析. 一.Spring MVC 3.0介绍 Spring MVC是一个典型的MVC框架,是Spring内置的Web框架,可以作为应用项目的展示层,继Spring 2.0对Spring MVC进行重大升级后,Spring 2.5又为Spring MVC引入了注解驱动功能,再到3.0时代,全

Hibernate注解映射联合主键的三种主要方式

今天在做项目的时候,一个中间表没有主键,所有在创建实体的时候也未加组件,结果报以下错误: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateSessionFactory' defined in class path resource [spring-config/ac-cif-srv-config.xml]: Invocation of init met

(转)Hibernate注解使用以及Spring整合

原文转自:http://wanqiufeng.blog.51cto.com/409430/484739 (1)简介:在过去几年里,Hibernate不断发展,几乎成为Java数据库持久性的事实标准.它非常强大.灵活,而且具备了优异的性能.在本文中,我们将了解如何使用Java 5 注释来简化Hibernate代码,并使持久层的编码过程变得更为轻松.传统上,Hibernate的配置依赖于外部 XML 文件:数据库映射被定义为一组 XML 映射文件,并且在启动时进行加载.    在最近发布的几个Hib

Hibernate注解----关联映射注解以及课程总结详解----图片版本

上一篇,记录了Hibernate注解----类级别注解以及属性注解详解 ,我们这一节主要讲解的是Hibernate注解----关联映射注解以及课程总结详解. 本节的主要内容: 第3章 关联映射注解 3-1 本章简介 3-2 实体之间的关系 3-3 一对一单向外键关联(一) 3-4 一对一单向外键关联(二) 3-5 一对一双向外键关联 3-6 一对一单向外键联合主键 3-7 多对一单向外键关联(一) 3-8 多对一单向外键关联(二) 3-9 一对多单向外键关联 3-9 一对多双向外键关联 3-10

关于使用hibernate注解总结

首先,我们先了解一下什么是hibernate注解: Hibernate提供了Hibernate Annotations扩展包,它可以替代复杂的*hbm.xml,从而使得hibernate程序的开发大大简化. 带注解的持久类也是普通POJO,它们只是具备了持久性注解的普通POJO 事实上,使用注解时我们可以保持字段的持久性(注解写在成员变量上) 也可以保持属性(注解写在getter方法上)的持久性. 接下来,我们看一下hibernate常用的注解有哪些以及如何使用 @Entity--注释声明该类为