• Hibernate中注解的开发


    转自:https://blog.csdn.net/liujiahan629629/article/details/22335563

    在利用注解开发数据库持久层以前,需要学习一个规范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配置文件属性都是一一对应的,及时不一样,也会有与之类似的属性进行实现其功能,所以我们可以对比着使用。当然这里只是一些常用的,当我们需要时还需要我们查看文档进行编写。

            

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

      1 <span style="font-size:18px;">@Entity
      2 @Table(name="t_org")
      3 public class Org {
      4 
      5     private String id;
      6     private String name;
      7     private String code;
      8     private String manager;
      9     private String remark;
     10     private String createtime;
     11     private String updatetime;
     12     
     13     private OrgType orgType;
     14     
     15     private String pid;
     16     
     17     @Transient
     18     public String getPid() {
     19         return pid;
     20     }
     21 
     22     public void setPid(String pid) {
     23         this.pid = pid;
     24     }
     25 
     26     private Org parentOrg;
     27     
     28     private Set<Org> childOrgSet ;
     29 
     30     @Id
     31     @GenericGenerator(name="hibernate-uuid", strategy="uuid")
     32     @GeneratedValue(generator="hibernate-uuid")
     33     public String getId() {
     34         return id;
     35     }
     36 
     37     public void setId(String id) {
     38         this.id = id;
     39     }
     40 
     41     public String getName() {
     42         return name;
     43     }
     44 
     45     public void setName(String name) {
     46         this.name = name;
     47     }
     48 
     49     public String getCode() {
     50         return code;
     51     }
     52 
     53     public void setCode(String code) {
     54         this.code = code;
     55     }
     56 
     57     public String getManager() {
     58         return manager;
     59     }
     60 
     61     public void setManager(String manager) {
     62         this.manager = manager;
     63     }
     64 
     65     public String getRemark() {
     66         return remark;
     67     }
     68 
     69     public void setRemark(String remark) {
     70         this.remark = remark;
     71     }
     72 
     73     @Column(updatable=false)
     74     public String getCreatetime() {
     75         return createtime;
     76     }
     77 
     78     public void setCreatetime(String createtime) {
     79         this.createtime = createtime;
     80     }
     81 
     82     @Column(insertable=false)
     83     public String getUpdatetime() {
     84         return updatetime;
     85     }
     86 
     87     public void setUpdatetime(String updatetime) {
     88         this.updatetime = updatetime;
     89     }
     90 
     91     @ManyToOne
     92     @JoinColumn(name="orgTypeId")
     93     public OrgType getOrgType() {
     94         return orgType;
     95     }
     96 
     97     public void setOrgType(OrgType orgType) {
     98         this.orgType = orgType;
     99     }
    100 
    101     @ManyToOne
    102     @JoinColumn(name="pid", updatable=false)
    103     public Org getParentOrg() {
    104         return parentOrg;
    105     }
    106 
    107     public void setParentOrg(Org parentOrg) {
    108         this.parentOrg = parentOrg;
    109     }
    110 
    111     @OneToMany(mappedBy="parentOrg")
    112     @JoinColumn(name="pid")
    113     @OrderBy("code")
    114     public Set<Org> getChildOrgSet() {
    115         return childOrgSet;
    116     }
    117 
    118     public void setChildOrgSet(Set<Org> childOrgSet) {
    119         this.childOrgSet = childOrgSet;
    120     }
    121 }
    122 </span>

    3.

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

     1 <span style="font-size:18px;"> <!-- Hibernate核心对象 -->
     2     <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
     3           <!--省略……-->
     4          <!--指定进行了Hibernate注解开发的包,方便框架进行扫描设置-->
     5          <property name="packagesToScan">
     6             <list>
     7                 <value>com/ljh/ppp/domain</value>
     8             </list>
     9         </property>
    10 </span>

    这样Hibernate框架的注解开发基本上就算完毕了,总体感觉是比较高效的。我们没写一个类一个方法,顺便将注解编写了,这样我们就不用专门用来编写映射文件了。掌握好注解的开发,在很多时候可以大大提高我们的效率。当然还有其它框架的注解运用,后边总结。

  • 相关阅读:
    deploy.sh
    error cross-zip@4.0.0: The engine "node" is incompatible with this module. Expected version ">=12.10". Got "10.16.3"
    could not compile E:\sqjw-web\node_modules\@nuxt\vue-app\template\App.js:connot resolve "element-ui/lib/theme-chalk/index.css"
    js如何查看元素类型
    修改tomcat浏览器地址栏图标
    a different object with the same identifier value was already associated withthe session异常解决方案
    org.springframework.dao.InvalidDataAccessApiUsageException:The given object has a null identifi的解决方案
    利用JS验证查询参数-选择月份后必须选择年份
    算术运算函数
    数据的输出与数值传递
  • 原文地址:https://www.cnblogs.com/sharpest/p/6220875.html
Copyright © 2020-2023  润新知