`
du_bo
  • 浏览: 41152 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类

常用的hibernate annotation标签

 
阅读更多
@Entity              --注释声明该类为持久类。将一个Javabean类声明为一 个实体的数据库表映射类,最好实现序列化.此时,默认情况下,所有的类属性都为映射到数据表的持久性字段.若在类中,添加另外属性,而非映射来数据库的, 要用下面的Transient来注解.

@Table(name="promotion_info")      --持久性映射的表(表名="promotion_info).@Table是类一级的注解,定义在@Entity下,为实体bean映射表,目录和schema的名字,默认为实体bean的类名,不带包名.

@Id--注释可以表明哪种属性是该类中的独特标识符(即相当于数据表的主键)。 
@GeneratedValue   --定义自动增长的主键的生成策略. 
@Transient             --将忽略这些字段和属性,不用持久化到数据库.适用于,在当前的持久类中,某些属性不是用于映射到数据表,而是用于其它的业务逻辑需要,这时,须将这些属性进行transient的注解.否则系统会因映射不到数据表相应字段而出错. 
@Temporal(TemporalType.TIMESTAMP)--声明时间格式 
@Enumerated         --声明枚举 
@Version                --声明添加对乐观锁定的支持 
@OneToOne            --可以建立实体bean之间的一对一的关联 
@OneToMany          --可以建立实体bean之间的一对多的关联 
@ManyToOne          --可以建立实体bean之间的多对一的关联 
@ManyToMany        --可以建立实体bean之间的多对多的关联 
@Formula               --一个SQL表达式,这种属性是只读的,不在数据库生成属性(可以使用sum、average、max等) 
@OrderBy               --Many端某个字段排序(List)
 
 
1.2
Hibernate 能够出色地自动生成主键。Hibernate/EBJ 3 注释也可以为主键的自动生成提供丰富的支持,允许实现各种策略。
其生成规则由@GeneratedValue设定的.这里的@id和@GeneratedValue都是JPA的标准用法, JPA提供四种标准用法,由@GeneratedValue的源代码可以明显看出. 
JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO. 
TABLE:使用一个特定的数据库表格来保存主键。 
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。 
IDENTITY:主键由数据库自动生成(主要是自动增长型) 
AUTO:主键由程序控制。
在指定主键时,如果不指定主键生成策略,默认为AUTO。 
@Id
相当于
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
 
identity:
使用SQL Server 和 MySQL 的自增字段,这个方法不能放到 Oracle 中,Oracle 不支持自增字段,要设定sequence(MySQL 和 SQL Server 中很常用)。
Oracle就要采用sequence了.
 
同时,也可采用uuid,native等其它策略.(相关用法,上网查询)
[2]
第一个持久性类 
@Entity 
@Table(name="T_MODEL_PLANE"
public class ModelPlane    implements Serializable { 
        @Id 
        @Column(name="PLANE_ID")    
        @GeneratedValue(strategy=GenerationType.AUTO) //注解于属性中 
/* 
对于oracle想使用各自的Sequence,设置如下:        
@GeneratedValue(strategy = GenerationType.AUTO,generator="PROMOTION_SEQ")        
@SequenceGenerator(name="PROMOTION_SEQ",sequenceName="PROMOTION_SEQ")    
 
另外:
对于自动增长后,在数据表中的相应字段,要设置字段为auto_increment.
*/
 
        private Long id; 

        private String name;//注解写于getter方法之上.请见下. 

     //DATE            - java.sql.Date        
     //TIME            - java.sql.Time        
     //TIMESTAMP - java.sql.Timestamp        
     @Temporal(TemporalType.TIMESTAMP)        
     @Column(name="start_time")        
     private Date startTime;     

     //显示0 隐藏1        
     public static enum DisplayType {显示,隐藏}        
     @Enumerated(value = EnumType.ORDINAL)//ORDINAL序数        
     private DisplayType displayType = DisplayType.显示;    

        //1.sql语句中的字段和表名都应该和数据库相应,而不是类中的字段,        
     //若带有参数如la.id= id,这个=id才是类中属性        
     //2.操作字段一定要用别名        
     @Formula(select COUNT(la.id) from largess la)        
     private int count;    

        //注解于方法中 
        @Column(name="PLANE_ID", length=80, nullable=true//较详细定义 
        public String getName() { 
                return name; 
        } 
        public void setName(String name) { 
                this.name = name; 
        } 
其它的setter,getter省略...... 
}

该内容将映射到下表中: 
CREATE TABLE T_MODEL_PLANE 

        PLANE_ID long
        PLANE_NAME varchar 
        其它字段省略... 
)    
默认情况下,Hibernate 会将持久类以匹配的名称映射到表和字段中。例如,下例中,若不用注解,则会映射到如下一表中:
CREATE TABLE MODELPLANE
(
    ID long,
    NAME varchar
    其它字段省略...
)
[3]
一对多注解:
1.
在一对多注解中,会用到:
"一"方:
@OneToMany --> mappedBy:"多"方的关联属性(被控方)
"多"方:
@ManyToOne --> @JoinColumn,"多"方定义的外键字段.
如数据表定义外键如下:
FOREIGN KEY (classid) REFERENCES classes(id)
则:
@JoinColumn(name="classid"
2.
在双向关联中,有且仅有一端作为主体(owner)端存在:主体端负责维护联接列(即更新),对于不需要维护这种关系的从表则通过mappedNy属性进行声明。mappedBy的值指向另一主体的关联属性。例子中,mappedBy的值为classes。
附加说明:
mappedBy相当于过去的inverse="true".
inverse=false的side(side其实是指inverse=false所位于的class元素)端有责任维护关系,而inverse=true端无须维护这些关系。
3.
cascade与fetch使用说明:
Cascade
CascadeType.PERSIST (级联新建) 
CascadeType.REMOVE  (级联删除) 
CascadeType.REFRESH (级联刷新) 
CascadeType.MERGE   (级联更新)中选择一个或多个。 
CascadeType.ALL
 fetch属性:
关联关系获取方式,即是否采用延时加载。
 LAZY(默认值)采用延时加载,查询数据时,不一起查询关联对象的数据。而是当访问关联对象时(如:getStudnets()时)才触发相应的查询操作,获取关联对象数据。
EAGER:是在查询数据时,也直接一起获取关联对象的数据。
package oneToMany; 
import java.util.Set; 
import javax.persistence.*; 
/* 
注意导入时,是导入:import javax.persistence.*;    
非导入org.hibernate的相关类:import org.hibernate.annotations.Entity; 
*/
 
@Entity 
@Table(name="classes"
public class Classes implements Serializable { 
  @Id 
  @GeneratedValue(strategy=GenerationType.AUTO) 
  private int id; 
  private String name; 
    
  @OneToMany(cascade=CascadeType.ALL,mappedBy="classes")    
  private Set<Student> students; 
//getter,setter省略 



package oneToMany; 
import javax.persistence.*; 
@Entity 
@Table(name="student"
public class Student implements Serializable  { 
  @Id 
  @GeneratedValue(strategy=GenerationType.AUTO) 
  private int sid; 
    
  private String sname; 
    
  //若有多个cascade,可以是:{CascadeType.PERSIST,CascadeType.MERGE} 
  @ManyToOne(cascade={CascadeType.ALL})         
  @JoinColumn(name="classid")     //student类中对应外键的属性:classid 
  private Classes classes; 
//getter,setter省略 



public class TestOneToMany { 
/* 
CREATE TABLE    student (    --要定义外键!!!!!!! 
    `sid` double NOT NULL auto_increment, 
    `classid` double NULL, 
    `sname` varchar(255) NOT NULL, 
    PRIMARY KEY    (sid), 
    INDEX par_ind (classid), 
    FOREIGN KEY (classid) REFERENCES classes(id) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB 
*/
    
  public static void main(String[] args) throws SQLException    
  { 
    try 
    { 
      SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory(); 
      Session session=sf.openSession(); 
      Transaction tx=session.beginTransaction();         
/*
因为mappedBy是定义在classes中,即classes类不负责维护级联关系.即维护者是student.所以,
1.要将clsses的数据,赋给student,即用student的setClasses()方法去捆定class数据;
2.在进行数据插入/更新session.save()/session.update()时,最后操作的是student.
*/
      Classes classes=new Classes(); 
      classes.setName("access"); 
        
      Student st1=new Student(); 
      st1.setSname("jason"); 
      st1.setClasses(classes); 
      session.save(st1); 
        
      Student st2=new Student(); 
      st2.setSname("hwj"); 
      st2.setClasses(classes); 
      session.save(st2); 
      tx.commit();
/* 
输出如下:
Hibernate: insert into classes (name) values (?)
Hibernate: insert into student (classid, sname) values (?, ?)
Hibernate: insert into student (classid, sname) values (?, ?)
*/
/*
因为一端维护关系另一端不维护关系的原因,我们必须注意避免在应用中用不维护关系的类(class)建立关系,因为这样建立的关系是不会在数据库中存储的。
如上的代码倒过来,则插入时,student的外键值为空.如下:
*/
//      Student st1=new Student(); 
//      st1.setSname("jason"); 

//      session.save(st1); 
//        
//      Student st2=new Student(); 
//      st2.setSname("hwj"); 
//      session.save(st2); 
//        
//      Set<Student> students=new HashSet<Student>(); 
//      students.add(st1); 
//      students.add(st2); 
//        
//      Classes classes=new Classes(); 
//      classes.setName("access"); 
//      classes.setStudents(students); 
//      session.save(classes); 
/*
输出如下:
Hibernate: insert into student (classid, sname) values (?, ?)
Hibernate: insert into student (classid, sname) values (?, ?)
Hibernate: insert into classes (name) values (?)
*/
    } 
    catch(HibernateException e) 
    { 
      e.printStackTrace();        
    } 
  } 
}
 
 
[4]
多对多注解: 
在多对多注解中,双方都采用@ManyToMany.
其中被控方,像一对多注解中设置一样,也要设置mappedBy.
其中主控方,不像一对多注解那样,采用@joinColumn,而是采用@joinTable.如下:
@JoinTable(name="j_student_course" ,joinColumns={@JoinColumn(name="sid")},inverseJoinColumns={@JoinColumn(name="cid")})
其中,
如上所说,mappedBy,相当于inverse="true".所以,在@joinTable中的inverseJoinColumns中定义的字段为mappedBy所在类的主键.
joinColumns定义的字段,就是当前类的主键.
@Entity 
@Table(name="jcourse"
public class Jcourse { 
  @Id 
  @GeneratedValue(strategy=GenerationType.AUTO) 
  private int cid; 
  private String cname; 
    
  @ManyToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE},fetch=FetchType.LAZY ,mappedBy="courses"
  private Set<Jstudent> students; 
//setter,getter省略....    



@Entity 
@Table(name="jstudent"
public class Jstudent { 
  @Id 
  @GeneratedValue(strategy=GenerationType.AUTO) 
  private int sid; 
    
  private String sname; 
    
  @ManyToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE},fetch=FetchType.EAGER) 
  //inverseJoinColumns中对应的id为以下属性course的对应id. 
  @JoinTable(name="j_student_course" ,joinColumns={@JoinColumn(name="sid")},inverseJoinColumns={@JoinColumn(name="cid")}) 
  private Set<Jcourse> courses; 
//setter,getter省略....    



public class Test { 
  public static void main(String[] args) { 
    try 
    { 
      SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory(); 
      Session session=sf.openSession(); 
      Transaction tx=session.beginTransaction(); 
        
      Jcourse course=new Jcourse(); 
      course.setCname("jason-english"); 
      session.save(course); //先各自保存. 
        
      Jcourse course2=new Jcourse(); 
      course2.setCname("herry-english"); 
      session.save(course2); 
        
      Set<Jcourse> courses=new HashSet<Jcourse>(); 
      courses.add(course); 
      courses.add(course2); 
        
      Jstudent student=new Jstudent(); 
      student.setSname("jason"); 
      student.setCourses(courses); 
        
      session.save(student);// 要用非mapby定义的类(studet)来作为主者(会控制级联关系),一对多,多对一也一样道理. 
      //可以尝试反过来. 
      tx.commit(); 
    } 
    catch(HibernateException e) 
    { 
      e.printStackTrace();        
    } 
  } 
}
 
原文地址:http://shenzhenchufa.blog.51cto.com/730213/291787
分享到:
评论

相关推荐

    Hibernate Annotation 笔记 总结 注解

    【标签】:Hibernate, Annotation, 笔记, 总结, 注解 【正文】: Hibernate Annotation是Hibernate框架的一个重要特性,它允许开发者直接在Java类上使用注解来定义对象的数据库映射,从而避免了传统的XML配置文件...

    struts Spring Hibernate标签和注解资料合集

    springmvc注解.doc,Spring注解讲解.doc,struts2标签详解.pdf,struts2常用标签.pdf,Struts2页面开发中常用标签.pdf,Struts2注解详细说明文档.doc,Hibernate注解教程:Hibernate Annotation使用实例.maff

    Hibernate Annotation 共享主键一对一双向关联

    在Java的持久化框架中,Hibernate是一个非常常用且强大的ORM(对象关系映射)工具,它使得开发者可以方便地将数据库操作转化为面向对象的方式。在实际的项目开发中,我们经常遇到各种各样的关联关系,比如一对一、一...

    Hibernate annotation

    1. @Entity:用于标记一个类作为Hibernate管理的实体类,相当于XML中的标签。 2. @Table:定义实体类所对应的数据库表名,可以设置schema和catalog属性来指定库和表的命名空间。 3. @Column:用于指定实体类属性与...

    hibernate-validator-annotation-processor-5.1.0.CR1.zip

    这个标签表明上述提到的两个工具——Hibernate Validator Annotation Processor 5.1.0.CR1和generate-default-impl-maven-plugin,都是开源软件项目。这意味着它们的源代码公开,允许社区成员查看、使用、修改并分发...

    完整版spring hibernate整合采用annotation

    总的来说,"完整版spring hibernate整合采用annotation"是一个涵盖多个知识点的主题,包括Spring注解驱动开发、Hibernate的ORM注解、Spring与Hibernate的整合配置、事务管理以及相关的开发工具使用。通过深入学习和...

    第一个Hibernate with Annotation程式(转)

    【标题】:“第一个Hibernate with Annotation程式(转)” 在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发人员使用面向对象的编程方式来操作数据库,而无需直接编写SQL语句。这个标题...

    Spring-Hibernate的通过标签分页源码

    在这个"Spring-Hibernate的通过标签分页源码"中,我们可以深入理解如何在前端和后端实现基于Display Tag的分页功能。 Display Tag是一个开源的JSP标签库,它提供了很多用于表格展示和分页的功能,极大地简化了Web...

    hibernate应用[包括示例,映射,主键自增,各种查询操作方式以及配置文档以及 Annotation示例]

    - **Hibernate with Annotation 示例.doc、Hibernate Annotation.doc**:提供使用注解进行对象映射的实例。 - **Hiberante的对象继承关系之--TPC一个类一张表.doc**:讲述Hibernate处理对象继承和多表映射的方法。 -...

    hibernate4.3.8的annotation及xml的一对多的双向案例

    XML配置方面,我们需要在`hibernate.cfg.xml`文件中配置数据源、JDBC驱动等基本信息,并在`hibernate-mapping`标签下为每个实体类创建对应的`class`标签,然后定义一对一或一对多的关系。对于一对多关系,可以使用`...

    Hibernate之第2解之-hibernate_demo_1_annotation

    【标签】"源码"提示我们这个压缩包可能包含了一份可运行的代码示例,用于演示Hibernate的用法。"工具"可能指的是Hibernate作为Java开发中的一个工具库,用于简化数据库操作。 【文件名称列表】"hibernate_demo_1_...

    Struts1.3 + Hibernate3.3 + Spring3.0 Annotation整合

    同时,可以通过Spring的ModelDriven接口或FormBean标签将模型对象注入到Action中。 5. **整合Hibernate和Spring**:通过Spring的HibernateTemplate或SessionFactoryUtils,可以在Service层中方便地操作数据库,避免...

    基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合开发

    在基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合开发中,开发者可以利用注解(Annotation)来简化配置,提高开发效率。这个开发模式结合了三个主流的Java EE框架:Struts2作为MVC框架处理前端请求,...

    2个案例 自定义annotation进行查询对象封装 itext 打印案例

    标题中的“自定义annotation进行查询对象封装”涉及的是在编程中使用注解(Annotation)来增强代码的功能,特别是在数据查询和对象映射方面。注解是一种元数据,它提供了将信息附加到代码(如类、方法或变量)的方式...

    ssh2 annotation 基本jar

    SSH2(Struts2、Spring、Hibernate)是一个经典的Java Web开发框架组合,它结合了Struts2的MVC设计模式,Spring的依赖注入和事务管理,以及Hibernate的对象关系映射能力。在这个“ssh2 annotation 基本jar”中,我们...

    Hibernate更新某些字段

    ### 方法一:在 XML 中设置 property 标签 update = "false" 在 Hibernate 的 XML 配置文件中,我们可以设置某些属性的 update 属性为 false,这样 Hibernate 就不会更新这些属性。例如,我们可以设置 age 属性的 ...

    Hibernate一对一单向外键关联(annotation/xml)

    XML配置中的`&lt;one-to-one&gt;`标签定义了与`Person`实体的一对一关联,并通过`foreign-key`属性指定外键列名。 **总结** 在Hibernate中,一对一单向外键关联可以显著简化数据库操作,尤其是在处理复杂业务逻辑时。...

    基于Annotation并对DAO层封装具有分页功能的S2SH整合实例

    2. 创建实体类,并使用Hibernate的Annotation进行数据映射。 3. 编写BaseDAO接口和具体DAO实现,实现分页查询方法。 4. 在Spring配置文件中注册DAO实现,并配置实体类的SessionFactory。 5. 创建Action类,注入...

    Hibernate和spring集成

    例如,通过`&lt;bean&gt;`标签定义数据源、SessionFactory,并使用`&lt;tx:annotation-driven&gt;`开启基于注解的事务管理。 3. **事务管理** Spring提供了声明式事务管理,通过`@Transactional`注解可以在方法级别控制事务的...

Global site tag (gtag.js) - Google Analytics