• hibernate注解映射属性


    https://blog.csdn.net/dada678/article/details/51786201

    1、普通属性

    @Entity:修饰的持久化类的所有属性都会被映射到底层数据库。

    @Column:修饰属性

    @Transient:修饰不想持久化保存的属性。

    @Lob:修饰大数据属性。

    当属性为byte[]、Byte[]时数据库对应Blob

    当属性为char[]、character[]、String时,对应为Clob.

    @Temporal修饰日期类型

    支持TemporalType.DATE、TemporalType.TIME、TemporalType.TIMESTAMP

    @GenericGenerator注解主键生成器  name strategy

    例如:

    @GenericGenerator(name="fk_hilo",strategy="hilo" )    //指定主键生成策略为hilo

    @GeneratedValue(generator="fk_hilo")     //使用该主键生成策略

    2、映射集合属性

    集合分为两种类型:一、List、Set、数组

    二、Map

    hibernate要求持久化集合值字段必须声明为接口。

    不论哪种集合,统一使用@ElementCollection注释

    属性fetch指定抓取策略   targetClass:指定集合类型。

    外键列@JoinColumn

    当集合元素为基础数据类型时,用@Column注释定义集合元素即可

    @OrderColumn可以定义List集合、数组的索引列

    @MapKeyColumn用于映射Map集合的索引列

    例如:数组、list集合可以这样写

    @ElementCollection(targetClass=String.class)   //集合属性保存对象关联关系

    @CollectionTable(name="school_inf",joinColumns=@joinColumn(name="person_id",nullable=false))  //映射保存集合属性的表

    @Column(name="school_name")    //指定保存集合元素的列为school_name

    @OrderColumn(name="array_order")   //映射集合的索引列【数组的写法】

    @OrderColumn(name="list_order")  //映射保存集合元索引列

    private String[] schools;

    private List<String> schools = new ArrayList<>();

    例如:set集合,set集合无序,所以不用写OrderColumn

    <list name="school_name" table="school_inf">

    <key>

    <column name="person_id" not-null="true"/>

    </key>

    <list-index>

    <column name="array_order"/>

    <list-index>

    <element type="String" column="school_name"></element>

    </list>

    例如:

    @ElementCollection(targetClass=String.class)   //集合属性保存对象关联关系

    @CollectionTable(name="school_inf",joinColumns=@joinColumn(name="person_id",nullable=false))  //映射保存集合属性的表,nullable=false说明该列为非空。

    @Column(name="school_name",nullable=faluse)    //指定保存集合元素的列为school_name

    private Set<String> schools;

       <set name="school_name" table="school_inf" >
                <key>
                    <column name="person_id"  not-null="true" />
                </key>
                <element type="string" column="school_name"></element>
            </set>


    例如:

    List集合

    @ElementCollection(targetClass=Float.class)   //集合属性保存对象关联关系

    @CollectionTable(name="score_inf",joinColumns=@joinColumn(name="person_id",nullable=false))  //映射保存集合属性的表,nullable=false说明该列为非空。

    @MapKeyColumn(name="subject_name") //指定Map Key

    @Column(name="mark")    //指定保存集合元素的列为school_name

    @OrderColumn(name="list_order")  //映射保存集合元索引列

    Map集合属性

    @ElementCollection(targetClass=Float.class)
    //映射保存集合属性的表
    @CollectionTable(name="score_inf",//指定表名
    joinColumns=@JoinColumn(name= "person_id",nullable=false))
    @MapKeyColumn(name="subject_name")
    //指定Mapkey的类型为String类型
    @MapKeyClass(String.class)
    //映射保存MapValue的数据列
    @Column(name="mark")
    private Map<String, Float> scores = new HashMap<>();

    3、集合属性性能分析

    在初始化持久化实体时,立即抓取所有的集合属性,将导致性能急剧下降,对于集合属性,通常使用延时加载策略。

    @ElementCollection(fetch=FetchType.EAGER)

    无序集合只能遍历,性能差

    虽然数组也是有序结合,但是数据无法使用延时加载(因为数组长度不可变),所以实际上用数组作为集合性能并不高,通常认为List、Map集合性能较高,而

    Set紧随其后

    提高性能的策略:

    对于删除集合中的元素,保留部分元素的情况,应该先清空集合,再插入保留元素。

    List<String> tmp=person.getSchools();

    person.setSchools(null);  //清空操作

    person.setSchools(tmp);

     4、有序集合映射

         如果希望数据库查询自己对集合元素排序,可以利用Hibernate自己提供的@OrderBy注解

    1

    @OrderBy("traing_name desc");

    2

    //有序集合属性
    @ElementCollection(targetClass=String.class)
    //映射保存集合元素的
    @CollectionTable(name=@"training_inf",joinColumns=@JointColumn(name="person_id",nullable=false))
    //定义保存集合元素的数据列
    @Column(name="training_name",nullable=false)
    //使用@SortNatural指定使用自然排序
    @SortNatural
    private SortedSet<String>trainings = new TreeSet<>();

    5、映射数据库对象

    如果希望在映射文件中创建和删除触发器,存储过程等数据库对象,hibernate提供了<database-object/>元素来满足这种需求

    1.在映射文件显示生命create和drop命令

    <hibernate-mapping>

      

      <database-object>

       <create>create trigger t_full_conent_gen ..</create>

       <drop>create trigger t_full_content_gen</drop>

        <!----指定某些数据库仅在特定的方言中使用--->

        <!---指定仅对MySQL数据库有效-->

        <dialect-scope name="org.hibernate.dialect.MySQL5Dialect"/>

        <dialect-scope name="org.hibernate.dialect.MySQL5InnoDBDialect"/>

      </database-object>

    </hibernate-mapping>

    2.提供一个类,这个类组织create和drop命令 这个类必须实现org.hibernate.mapping.AuxiliaryDatabaseObject接口

    <hibernate-mapping>

      

      <database-object>

       <definition class="MyTriggerDefinition">

      </database-object>

    </hibernate-mapping>

    <database-object>

      <create>create table test(t_name varchar(255))</create>

      <!--指定仅对特定方言有效-->

      <dialect-scope name="org........"/>

    </database-object>

       这样在创建sessionFactory对象时,上面代码就生效了,数据库中就新建了test表。

    Hibernate提供了schemaExport工具,生成数据库对象。[仅根据映射文件来生成数据库对象]

    Configuration conf=new Configuration().configure();

    SchemaExport se=new SchemaExport(conf);

    se.setFormat(true)   //格式化sql

      .setOutputFile("news.sql")    //设置保存sql脚本的文件

    .create(true,true);  //输入sql脚本并执行

    //////SchemaExport工具类    使用java命令来解释执行工具类   命令格式如下

    java -cp hibernate_classpaths org.hibernate.toolw.hbm2ddl.SchemaExport options mapping_files

    6、映射组件属性:

    持久化类属性并不是基础数据类型,例如privte Name name;

    一、可以用@Embeddable注释Name类,作为组件使用,用@Parent修饰该属性。(修饰Name里的 private Person owner)

    二、直接在Person实体类中,包含一个组件类型(Name类)

    1.

    @Embeddable

    class Name{

      //引用拥有该Name的Person对象

    @Parent 

    private Person owner;

    }

    class Person{

    //Name组件

      private Name name;

    }

    2.class Person{

      //主键属性Name

      @Embedded

      @AttributeOverrides({

      @AttributeOverride(name="first",column=@Column(name="person_firstname")),

      @AttributeOverride(name="last",column=@Column(name="person_lastname")),

    })

    }

    3.组件属性为集合

    class Name{

     @ElementCollection(targetClass=Integer.class)

      @CollecitonTable(name="power_inf",joinColumns=@JoinColumn(name="person_name_id",nullable=false))

      @MapKeyColumn(name="power_inf")////////////

      @Column(name="name_power",nullable=false)

      @MapKeyClass(String.class)

      prvate Map<String,Integer> power = new HashMap<>();

      @OrderColumn(name="power_inf")/////

      private List<String> power = new ArraryList<>();

    }

    4.集合属性的元素为组件

    @Embeddable

    class Name{}

    @Entity

    @Table(name="person_inf")

    class Person{

      //Map集合元素是组件

      @ElementCollection(TargetClass=Score.class)

      @CollectionTable(name="score_inf",joinColumns=@JoinColumn(name="person_id",nullable=false))

      @MapKeyColumn(name="subject_name")  

      @MapKeyClass(String.class)

      private Map<String,Score>scores = new HashMap<>();

      //List集合元素是组件

      @ElementColleciton(TargetClass=Name.class)

      @CollectionTable(name="nick_inf",joinColumns=@JoinColun(name="person_id",nullable=false))

      @OrderColumn(name="list_order")

      private List<Name> nicks = new ArrayList<>();

    }

    5.组件作为Map的索引

    @Embeddable

    class Name{

      //重写equals 和 hasCode方法

      public boolean equals(Object obj)

      {

        if (this == obj)

        {

          return true;

        }

        if (obj != null && obj.getClass() == Name.class) {

          Name target = (Name)obj;

          //属性值比较 自定义属性的比较

          return target.getFirst().equals(getFirst()) &&  target.getLast().equals(getLast);

        }

      }

      // 重写HasCode()方法, 根据first、last计算hashCode值

      retun getFirst().hasCode* 31 + getLast().hasCode();

    }

    @Enitity

    @Table()

    class Person{

      //集合属性nickPower

      @ElementColleciton(targetClass=Integer.class)

      @CollectionTable(name="nbick_power_inf",JoinColumns=@JoinColumn(name="person_id",nullable=false))

      @Column(name="nick_power",nullable=false)

      @MapKeyClass(Name.class)//指定mapKey的类型

    }

    7.组件作为符合主键

    class Name implements java.io.Serializable{

      //重写equal()和 hashCode()

    }

    @Entity

    @Table(name="")

    class Person{

      //以Name组件作为标识属性    用法同@Embedded     @Embedded用于修饰普通的组件属性

      //@EmbeddedId用于修饰组件类型的组件 同样可以结合@AttributeOverrides 和@AttributeOverride两个注释

      @EmbeddedId

      @AttributeOverrides({

        //指定 组件内各属性与底层数据列之间的映射

        @AtributeOverride(name="first",column=@Column(name="person_firstname"))

        @AtributeOverride(name="last",column=@Column(name="person_lastname"))

        })

    }

    8.多列作为联合主键

    持久化类必须满足

    1)无参数的构造器   2)实现java.io.Serializable  3)联合主键所映射的属性重写equals()和 hashCode()

    @Entity

    @Table(name="")

    class Person{

        //使用联合主键 只需要使用@Id修饰两个成员变量即可

      @Id 

      prvate String first;

      @Id

      private String last;

      //重写Equals()方法 和 hashCode()方法

      

    }
    ---------------------

    原文:https://blog.csdn.net/dada678/article/details/51786201
    版权声明:本文为博主原创文章,转载请附上博文链接!

     9使用xml映射符合主键

    在person.hbm.xml中

    <hibernate-configuration>

      

    <class name="Person" table="person_inf">
      <!--映射组件类型的标识属性,映射复合主键-->
      <composite-id name="name" class="Name">
        <!--映射符合主键里的各个属性-->
        <key-property name="first" type="string"/>
        <key-property name="last" type="string"/>
      </composite-id>
      <!--映射普通属性-->
      <property name="email" type="string">
      <!--映射组件属性cat,组件属性的类型为Cat-->
      <component>
        <!--指定owner属性代表容器实体-->
        <parent name="owner"/>
        <!--映射组件属性的fisrt属性-->
        <property name="name" column="cat_name"/>
        <!--映射组件属性的last属性-->
        <property name="color" column="cat_color"/>
      </component>
      </class>

    </hibernate-configuration>

    Hibernate提供了如下三种方式将POJO变成PO类。

    1使用持久化注解(以JPA标准注解为主,如果有一些特殊要求,则依然需要使用 Hibernate本身提供的注解

    种方式可以

    2使用JPA2提供的XML配置描述文件(XML deployment descriptor),使用这种方式可以让Hibernate的PO类与JPA实体类兼容。

    3使用 Hibernate传统的XML映射文件(* hbm. xml文件的形式),由于这种方式是传统 Hibernate

    对于 Hibernate PO类而言,通常可以采用如下两个注解来修饰它。

    @ Entity:被该注解修饰的POJO就是一个实体。使用该注解时可指定一个name属性,name属性指定该实体类的名称,但大部分时候无须指定该属性,因为系统默认以该类的类名作为实体类的名称

    @ Table::该注解指定持久化类所映射的表。

    使用Table注解可指定如表52所示的属性

    属性

    是否必须

    说明

    catalog

    设置将持久化类映射的表放入指定的 catalog中,如果没有指定该属性,数据表将放入默认的 catalog中

    indexes

    为持久化类所映射的表设置索引。该属性的值是一个@Index注解数组

    name

    设置持久化类所映射的表的表名。如果没有指定该属性,那么该表的表名将与持

    久化类的类名相同

    schema

    设置将持久化类所映射的表放入指定的 schema中。如果没有指定该属性,数据表将放入默认的schema中

    uniqueConstraints

    为持久化类所映射的表设置唯一约束。该属性的值是一个@ UniqueConstraint注解数组

    @UniqueConstraint用于为数据表定义唯一约束。它的用法非常简单,使用该注解时可以指定如下唯一的属性

    columnNames

    该属性的值是一个字符串数组,每个字符串元素代表一个数据列

    @Index用于为数据表定义索引。该注解可指定如表53所示的属性。

    属性

    是否必须

    说明

    columnList

    设置对哪些列建立索引,该属性的值可指定多个数据列的列名

    name

    置该索引的名字

    unique

    设置该索引是否具有唯一性。该属性的值只能是 boolean值

    如果希望改变 Hibernate的属性访问策略,则可使用标准的@ Access注解修改该持久化类,该注解的value属性支持 AccessType.PROPERTY和 Access.TypeFIELD两个值。其默认值为 AccessType PROPERTY,

    即使用 getter/setter法访问属性两个方法

    如果将@Acess注解的value指定为 AccessType FIELD, Hibernate将直接通过成员变量来访问属性。

    除此之外, Hibernate还为持久化类提供了如下特殊的注解。

    @ Proxy:该注解的 proxyClass属性指定一个接口,在延迟加载时作为代理使用,也可以在这里

    指定该类自己的名字

    @ DynamicInsert:指定用于插入记录的 Insert语句是否在运行时动态生成,并且只插入那些非空字段。该属性的值默认是 false。开启该属性将导致 Hibernate需要更多时间来生成SQL语句。

    @ DynamicUpdate:指定用于更新记录的 update语句是否在运行时动态生成,并且只更新那些改变过的字段。该属性的值默认是 false。开启该属性将导致 Hibernate需要更多的时间来生成SOL语句

    提示

    程序打开了@ DynamicUpdate之后,持久化注解可以指定如下几种乐观锁定的策略

    1. OptimisticLockType.VERSION:检查 version/timestamp字段
    2. OptimisticLockType.ALL:检查全部字段
    3. OptimisticLockType.DIRTY:只检查修改过的字段
    4. OptimisticLockType.NONE:不使用乐观锁定

    强烈建议在 Hibernate中使用 version/timestamp字段来进行乐观锁定。对性能来说,这是最妤的选择,并且也是唯一能够处理在 Session外进行脱管操作的策略。

    @SelectBeforeUpdate:指定 Hibernate在更新( update)某个持久对象之前是否需要先进行一次查询(select)。如果将该注解的 value值设为ture,则 Hibernat可以保证只有当持久化对象的状态被修改过时,才会使用 update语句来保存其状态(即使程序显式使用 save OrUpdateO来保存该对象,但如果 Hibernate查询到对应记录与该持久化对象的状态相同,也不会使用update语句来保存其状态)。该注解的 value值默认为 false。通常来说,将@SelectBeforeUpdate的 value值设为ture会降低性能,如果应用程序中,某个持久化对象的状态经常会发生改变,那么该属性应该设置为 false;如果该持久化对象的状态很少发生改变,而程序又经常要保存该对象,则可将该属性设置为ture

    @PolymorphismType:当采用 TABLE_PER_CLASS继承映射策略时,该注解用于指定是否需要采用隐式多态查询。该注解的 value的默认值为 PolymorphismType.IMPLICIT,即支持隐式多态查询

    将@PolymorphismType的vaue值设为 PolymorphismType.IMPLICIT时,如果查询时给出的是任何超类、该类实现的接口或该类的名字,那么都会返回该类(及其子类)的实例;如果查询中给出的是子类的名字,则只返回子类的实例;否则,只有在查询时明确给出某个类名时,才会返回这个类的实例。大部分时候都需要使用隐式多态查询

    @ Where:该注解的 clause属性可指定一个附加的SQL语句过滤条件(类似于添加 where子句),如果一旦指定了该注解,则不管采用load()、get()还是其他查询方法,只要试图加载该持久化类对象时,该 where条件就会生效。也就是说,只有符合该where条件的记录才会被加载。

    @ BatchSize:当 Hibernate抓取集合属性或延迟加载的实体时,该注解的size属性指定每批抓取的实例数。

    @OptimisticLocking该注解的type属性指定乐观锁定策略。 Hibernate支持OptimisticLockType.ALL、OptimisticLockType.DIRTY、 OptimisticLockType.NONE、 OptimisticLocklype.VERSION这4个枚举值默认值为 OptimisticLockType.VERSION

    @ Check:该注解可通过 constraints指定一个SQL表达式,用于为该持久化类所对应的表指定一个 Check约束。

    @ Subselect::该注解用于映射不可变的、只读实体。通俗地说,就是将数据库的子查询映射成Hibernate持久化对象。当需要使用视图(其实质就是一个查询)来代替数据表时,该注解比较有用

    在默认情况下,被@Entity修饰的持久化类的所有属性都会被映射到底层数据表,为了指定某个属性映射的数据列的详细信息,如列名、列字段长度等,可以在实体类中使用@Column修饰该属性

    使用@ Column时可指定如表所示的常用属性

    属性

    是否必须

    说明

    columnDefinition

    属性的值是一个代表列定义的SQL字符串(列名后面部分),指定创建该数据列的SQL语句

    insertable

    指定该列是否包含在围生成的insert语句列表中,默认值true

    length

    指定列所能保存的数据的最大长度,默认值:255

    name

    指定该列的列名,该到的列名默认与Coum修饰的成员变量名相同

    nullable

    指定该列是否允许为null.默认值:true

    precision

    当该列是 decimal类型时,该属性指定该列最大支持的最大有效数字位

    scale

    当该列是 decimal类型时,该属性指定该列最大支持的小数位数

    table

    指定该列所属的表名,当需要用多个表来保存一个实体时,需要指定

    unique

    指定列是否具有准一的束,默认值为false,即不具有唯一约束

    updatable

    指定该列是否包含在 Hibemate生成的update语句的列到表中,默认值true

    Hiberate同样允许使用 @Access注解修饰该属性,用于单独改变 Hibemate对该属性的访问策略@Access用于覆盖在持久化类上指定的 @Access注解除此之外, Hibemate还为属性映射提供了如下特殊的注解

    @Formula该注解的value属性可指定一个SQL表达式,指定该属性的值将根据表达式来计算,持久化类对应的表中没有和计算属性对应的数据列----因为该属性值是动态计算出来的,无需保存到数据库

    @Generated设置该属性映射的数据列的值是否由数据库生成,该注解的 value属性可以接受GerationTime.NEVER(不由数据库生成)、 GenerationTime.INSERT(该属性值在执行insert句时生成,但不会在执行update语句时重新生成)和 Generationtime.ALWAYS该属性值在执行insert和update语句时都会重新生成)这三不值的其中之一。

    @Formula的 value属性允许对象属性包含表达式,包括运用sum、 average,mux函数求值的结果

    va1ue=”(select avg(p.price) from Product p)”

    @Formula甚至可以根据另外一个表的查询结果来计算当前记录的属性值,例如,下面代码把currency表查询的结果作为当前记录的计算属性值

    Value="(select cus.same from currency cur where cur.id=curreneyID)">

    使用 @Formula注解时有如下几个注意点

    1. value="(sql)"的英文括号不能少
    2. value="(sql)"的括号里面是SOL表达式,SQL表达式中的列名与表名都应该和数据库对应,而不是和持久化对象的属性对应
    3. 如果需要在@Formula的value属性中使用参数,则直接使用 where cur.id= currencyID形式,其中 currencyID就是参数,当前持久化对象的 curreneyID属性将作为参数传入

    import javax.persistence.Basic;

    import javax.persistence.Column;

    import javax.persistence.EnumType;

    import javax.persistence.Enumerated;

    import javax.persistence.FetchType;

    import javax.persistence.GeneratedValue;

    import javax.persistence.GenerationType;

    import javax.persistence.Id;

    import javax.persistence.Lob;

    import javax.persistence.Temporal;

    import javax.persistence.TemporalType;

    import javax.persistence.Transient;

    import javax.swing.JList.DropLocation;

     

    import org.hibernate.annotations.Formula;

    import org.hibernate.annotations.Generated;

    import org.hibernate.annotations.GenerationTime;

     

    public class News implements Serializable {

       public enum SeasonTime

       {

         springTime,summer,fall,winter

       }

       //使用@Enumerate修饰枚举

       @Enumerated(EnumType.ORDINAL)

       @Column(name="happen_season",length=50)//指定数据列表名称和长度   底层会保存数据序号来保存枚举值

       private SeasonTime happenSeason;

       /***

        * 使用@Lob、@Basic修饰大数据类型的属性

        * 用于数据库保存图片、保存大段文章的场景,数据库通常采用Blob、Clob类型的数据列来保存他们;

        * JDBC则采用java.sql.Blob、java.sql、Clob表示大数据类型

        * Hibernate使用@Lob来修饰这种大数据类型

        * 1.当持久化类的属性为byte[]、Byte[]或java.io.Serializable类型修饰的属性将映射为底层的Blob列

        * 2.当持久化类的属性为char[]、Character[]或java.lang.Strign类型时,@Lob修饰的属性将映射为底层的Clob

        * 使用@Basic指定延迟加载,可以指定如下属性

        * 1)fetch:指定是否延迟加载该属性。

        * FetchType.EAGER立即加载、FetchType.LAZY延迟加载

        * 2)optional:指定该属性映射的数据列是否允许使用null值

        * **/

       @Lob

       @Basic(fetch=FetchType.LAZY)

       private byte[] pic;

       /***

        * @GeneratedValue支持的属性

        * strategy 否  指Hibernate对该主键使用怎样的主键生成策略。该属性使用如下4个属性值

        * 1)GenerationType.AUTO:Hibernate自动选择最适合底层数据库的主键生成策略。这是默认值

        * 2)GenerationType.IDENTITY:对于MySQL、SQL Server这样的数据库,选择自增长这样的主键生成策略

        * 3)GenerationType.SEQUENCE:对于Oracle数据库,选择使用基于Sequence的主键生成策略。

        * 与@SequenceGennerator一起使用

        * 4)GenerationType.TABLE:使用辅助表来生成主键。与@TableGenerator一起使用

        * generator 否 当使用GeneatonType.SEQUENCE、GenerationType.TABLE主键生成策略时,

        * 该属性引用@SequenceGenerator、@TableGenerator所定义的生成器的名称

        * **/

       @Id

       @GeneratedValue(strategy=GenerationType.IDENTITY)

       private Integer id;

       private String title;

       private String autohor;

       /***

        * 使用@Temporal修饰日期类型的属性

        * java.util.Date既包括日期部分,也包括时间部分;使用@Temporal(TemporalType.DATE)将该属性映射到date类型的数据列

        * **/

       @Temporal(TemporalType.DATE)

       private Date date;

       //指定@Generated的value为ALWAYS,表明该属性的值由数据库生成

       //Hibernate会在每次执行insert、update时执行select语句来查询获取该属性的值

       //使用此属性需要数据库触发器支持

       /**

        * drop database hibernate;

    create database hibernate;

    use hibernate;

    create table news

    (

    id int auto_increment primary key,

    title varchar(255) not null,

    content varchar(255),

    full_content varchar(2555)

    );

    DELIMITER |

    create trigger t_full_content_gen BEFORE INSERT ON  news

       FOR EACH ROW BEGIN

         set new.full_content=concat(new.title,new.content);

       END;

    |

    DELIMITTER;  

     

        * **/

      

       @Generated(GenerationTime.ALWAYS)

       private String generContent;

       //此属性由系统根据公式生成

       @Formula("(select concat(nt.title,nt.autohor)"+"from NEWS nt where nt.id = id)")

       private String fullConent;

       //使用@Transient修饰不想持久保存的属性

       @Transient

       public Integer getId() {

         return id;

       }

       public void setId(Integer id) {

         this.id = id;

       }

       public String getTitle() {

         return title;

       }

       public void setTitle(String title) {

         this.title = title;

       }

       public String getAutohor() {

         return autohor;

       }

       public void setAutohor(String autohor) {

         this.autohor = autohor;

       }

       public Date getDate() {

         return date;

       }

       public void setDate(Date date) {

         this.date = date;

       }

       public News() {

    //   super();

         // TODO Auto-generated constructor stub

       }

       public News(String title, String autohor, Date date) {

         super();

         this.title = title;

         this.autohor = autohor;

         this.date = date;

       }

       @Override

       public String toString() {

         return "News [id=" + id + ", title=" + title + ", autohor=" + autohor + ", date=" + date + "]";

       }

      

      

    }

    @SequenceGenerator支持的属性

    属性

    是否必须

    说明

    name

    该属性指定该主键生成器的名称

    allocationSize

    该属性指定底层 Sequence每次生成主键值的个数,对于Oracle而言,该属性指定的整数值, 将作为定义 Sequence时 increment by的值

    schema

    该属性指定将底层 Sequence放入指定shema中,如果不指定该属性,该 Sequence将放入默认的 schema中

    catalog

    该属性指定将底层Sequence放入指定 catalog中,如果不指定该属性,该 Sequence将放入默catalog中

    initialValue

    该属性指定底层Sequence的初始值。对于Oracle而言,该属性指定的整数值将作为定义Sequence时startwith的值

    sequenceName

    该属性指定底层Sequnece的名称

    @TableGenerator支持的属性

    属性

    是否必须

    说明

    name

    该属性指定该主键生成器的名称

    allocationSize

    该属性指定底层辅助表每次生成主键值的个数

    catalog

    该属性指定将辅助表放入指定catalog中,如果不指定该属性,该辅助表将放入默认的catalog中

    schema

    该属性指定将底层辅助表放入指定catalog中,如果不指定该属性,该辅助表将放入默认的schema中

    table

    指定辅助表的表明

    initialValue

    该属性指定的整数值将作为辅助表的初始值。默认值:0

    pkColumnName

    该属性指定存放主键名的列名

    pkColumnValue

    该属性指定主键名

    valueColumnValue

    该属性指定存放主键名的列名

    indexes

    该属性值是一个@Index数组,用于为辅助表定义索引

    uniqueConstraints

    该属性值是一个@UniqueConstraint数组,用于为辅助表创建唯一约束

    主键生成策略

    1.

    @TableGenerator(name="newsGen",table="NEWS_ID_GEN",pkColumnName="gen_key",

       valueColumnName="gen_value",pkColumnValue="news_id")

       @TableGenerator(name="newsGen",table="NEWS_ID_GEN",

       pkColumnName="gen_key",valueColumnName="gen_value",

       pkColumnValue="news_id")

       //使用GeneratedValue.TABLE主键生成策略

    @GeneratedValue(strategy=GenerationType.TABLE,generator="newsGen")

    2.使用Hibernate的主键生成策略

    @GenericGenerator注解支持的属性

    1. name:必须属性指定主键生成器的名称,可以被@GeneratedValue的generator属性引用
    2. strategy:必须属性。设置主键生成策略
    3. Increment:主键类型long、short、int类型,只有在没有其他进程往同一表中插入数据时使用
    4. Identity:DB2、MySQL、MicsortSQL Server、Sybase和HypersonicSQL等。主键类型long、short、Int类型
    5. SequenceDB2、PostgreSQL、Oracle、SAPDB、McKoi等主键类型:long、short、int
    6. Hilo:高低位高效算法long、short、int类型的标识符
    7. seqhilo :高低位高效算法long、short、int类型的标识符,需要给定一个Sequence的数据库名,如Oracle
    8. uuid:128位UUID算法生成字符串类型的标识符号,UUID被编码为一个32位十六进制数的字符串
    9. guid: 在MicsortSQLSever和MySQL中使用数据库生成GUID字符串
    10. native: 根据底层数据库的能力选择identity、Sequence、或hilo中一个
    11. assigned:让应用程序在save()之前为对象分配一个标识符。相当于在不指定主键生成策略所采用默认策略
    12. select: 通过数据库触发器选择某个唯一主键的行,并返回器主键值作为标识属性值
    13. foreign: 直接使用另一个关联的对象的标识属性值、这种主键生成器只用于1-1关联

     

  • 相关阅读:
    C# 事务之SqlTransaction
    java获取字符串格式日期向前或向后n天的日期
    java中保留几位小数
    第一个androidAPP项目总结—ListView的上拉和下拉
    java中static作用详解
    第一个androidAPP项目总结—数据请求
    获取控件的高和宽
    Android学习笔记:如何设置ImageView中图片的显示方式
    TextView过长显示省略号, TextView文字中间加横线
    android中控件的使用
  • 原文地址:https://www.cnblogs.com/sundaysjava/p/10328299.html
Copyright © 2020-2023  润新知