• 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效果也是一样的。

  • 相关阅读:
    linux学习8 运维基本功-Linux获取命令使用帮助详解
    持续集成学习11 jenkins和gitlab集成自动触发
    持续集成学习10 Pipline初探
    持续集成学习9 jenkins执行脚本
    持续集成学习8 jenkins权限控制
    持续集成学习7 jenkins自动化代码构建
    持续集成学习6 jenkins自动化代码构建
    持续集成学习5 jenkins自动化测试与构建
    持续集成学习4 jenkins常见功能
    【Hadoop离线基础总结】MapReduce增强(下)
  • 原文地址:https://www.cnblogs.com/a15821617282/p/3732240.html
Copyright © 2020-2023  润新知