• Annotation(二)——Hibernate中注解的开发


    在利用注解开发数据库持久层以前,需要学习一个规范JPA(Java Persistence API),这也是SUN公司提出的数据库的持久化规范。就类似于JDBC,Servlet,JSP等规范一样。而Hibernate框架就实现了此规范,我们可以通过注解和配置文件来实现此规范。前边的学习都是建立在配置文件的基础上,而注解开发现在也处于一种趋势,毕竟它大大提高了开发速度。

            看一下注解在Hibernate框架中的开发知识。

            一,首先需要导入支持注解开发的jar包:

    hibernate-annotations.jar

    hibernate-commons-annotations.jar (Hibernate中支持注解开发的jar包)

    ejb3-persistence.jar(API规范的jar包)

    slf4j/slf4j-api-1.5.0.jar

    slf4j-log4j12-1.5.0.jar

    log4j-1.2.15.jar  (支持日志输出的jar包,注意版本的匹配)

            二,在Hibernate框架进行注解开发时,主要是代替实体和数据表的映射文件,而核心配置文件中的,数据库的连接等等,还是需要xml配置文件,进行配置的。先看一下Hibernate中常用的注解:

               1,@Entity : 表示当前的类为实体类,声明在类的前面。可以将当前类和数据库的表和字段进行关联映射。

               2,@Table:表示映射的表,声明在类的前面

               3,@Id:表示主键的映射,声明在主键的get方法前边,默认情况下主键利用assigned(用户提供)生成策略。如果想要设置API规范提供了四种主键生成策略:

    @GeneratedValue(strategy=GenerationType.AUTO)      相当于Hibernate框架的native主键生成策略

    @GeneratedValue(strategy=GenerationType.IDENTITY)  相当于Hibernate框架的identity主键生成策略,适用于MySQL,SQL Server

    @GeneratedValue(strategy=GenerationType.SEQUENCE)  相当于Hibernate框架的sequence主键生成策略,适用于Oracle,DB2

    @GeneratedValue(strategy=GenerationType.TABLE)     使用一张单表管理主键值。

             默认情况下API规范是不支持Hibernate框架中的uuid的主键生成策略,假如我们想要使用,需要我们进行增加主键生成器,如下:

    @GenericGenerator(name="hibernate-uuid",strategy="uuid")

    @GeneratedValue(generator="hibernate-uuid")

               4,@Column : 表示映射属性,和表的字段进行关联

               5,@ManyToOne : 表示映射关系中的多对一

               6,@JoinColumn : 表示外键映射属性,和表的外键字段进行关联

               7,@OneToMany : 表示映射关系中的一对多,这里需要注意,一对多时,外键的维护需要翻转交给多的一方进行维护,需要配置反转属性mappedBy,属性取值为多的一方的映射属性名称。相当于xml配置文件中的Inverse="true"。

               8,@OrderBy : 表示排序字段

               9,@Transient : 表示声明瞬时属性,不和数据库的字段发生关联,也就是没有表中列与之映射。

             等等吧,其实我感觉这些属性和xml配置文件属性都是一一对应的,及时不一样,也会有与之类似的属性进行实现其功能,所以我们可以对比着使用。当然这里只是一些常用的,当我们需要时还需要我们查看文档进行编写。

            

              三,看一个简单的利用主键开发的实体类吧,这里就不需要我们再编写配置文件了:

    @Entity
    @Table(name="t_org")
    public class Org {
    
        private String id;
        private String name;
        private String code;
        private String manager;
        private String remark;
        private String createtime;
        private String updatetime;
        
        private OrgType orgType;
        
        private String pid;
        
        @Transient
        public String getPid() {
            return pid;
        }
    
        public void setPid(String pid) {
            this.pid = pid;
        }
    
        private Org parentOrg;
        
        private Set<Org> childOrgSet ;
    
        @Id
        @GenericGenerator(name="hibernate-uuid", strategy="uuid")
        @GeneratedValue(generator="hibernate-uuid")
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getCode() {
            return code;
        }
    
        public void setCode(String code) {
            this.code = code;
        }
    
        public String getManager() {
            return manager;
        }
    
        public void setManager(String manager) {
            this.manager = manager;
        }
    
        public String getRemark() {
            return remark;
        }
    
        public void setRemark(String remark) {
            this.remark = remark;
        }
    
        @Column(updatable=false)
        public String getCreatetime() {
            return createtime;
        }
    
        public void setCreatetime(String createtime) {
            this.createtime = createtime;
        }
    
        @Column(insertable=false)
        public String getUpdatetime() {
            return updatetime;
        }
    
        public void setUpdatetime(String updatetime) {
            this.updatetime = updatetime;
        }
    
        @ManyToOne
        @JoinColumn(name="orgTypeId")
        public OrgType getOrgType() {
            return orgType;
        }
    
        public void setOrgType(OrgType orgType) {
            this.orgType = orgType;
        }
    
        @ManyToOne
        @JoinColumn(name="pid", updatable=false)
        public Org getParentOrg() {
            return parentOrg;
        }
    
        public void setParentOrg(Org parentOrg) {
            this.parentOrg = parentOrg;
        }
    
        @OneToMany(mappedBy="parentOrg")
        @JoinColumn(name="pid")
        @OrderBy("code")
        public Set<Org> getChildOrgSet() {
            return childOrgSet;
        }
    
        public void setChildOrgSet(Set<Org> childOrgSet) {
            this.childOrgSet = childOrgSet;
        }
    }
    </span>

    四,当然用了注解的开发方式,我们的核心配置文件就需要我修改了,这里就需要Hibernate的AnnotationSessionFactoryBean工厂类了,

     <!-- Hibernate核心对象 -->
        <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
              <!--省略……-->
             <!--指定进行了Hibernate注解开发的包,方便框架进行扫描设置-->
             <property name="packagesToScan">
                <list>
                    <value>com/ljh/ppp/domain</value>
                </list>
            </property>
      </bean>
  • 相关阅读:
    何必言精通——十年杂感 兼谈其它 总结
    寻找自己的道路——与技术同胞共勉 一种划分为七个阶段的道路:自信=>意志=>布局=>切入点=>团队=>渠道=>产品
    务虚:大局观、方法与关键点 个人经历例子说明 一种工作应对解决的方法
    程序员“宅钱”的几种方式和我的体会 程序员其他赚钱的路径:私单、站长、开发共享软件
    怎么看待移动互联网时代 关于移动互联网时代的一点个人看法总结 在强烈的产业变化时期,主流观点是不靠谱的 什么是浪潮呢? 小型化、无线化、智能化。
    为什么现在很多年轻人愿意来北上广深打拼,即使过得异常艰苦,远离亲人,仍然义无反顾? 谈谈程序员返回家乡的创业问题 利基市场就是那些不大不小的缝隙中的市场 马斯洛的需求无层次不适合中国。国人的需求分三个层次——生存、稳定、装逼。对应的,国内的产品也分三个层次——便宜、好用、装B。人们愿意为这些掏钱
    SSM项目的数据库密码加密方案
    Python两个变量的值进行交换的方法
    Python编码问题
    Python2.7.14新手学习
  • 原文地址:https://www.cnblogs.com/huangcongcong/p/4745356.html
Copyright © 2020-2023  润新知