`

Hibernate @Column、columnDefinition等简介(注意日期类型)

 
阅读更多

主要包括:

  1. @Id、@GeneratedValue
  2. @Column
  3. @Column之columnDefinition
  4. @Column控制浮点数精度
  5. @Temporal
  6. @Transient

 

 

@Id: 
@Id 标注用于声明一个实体类的属性映射为数据库的主键列。该属性通常置于属性声明语句之前,可与声明语句同行,也可写在单独行上。
@Id标注也可置于属性的getter方法之前。

@GeneratedValue: 
@GeneratedValue 用于标注主键的生成策略,通过strategy 属性指定。默认情况下,JPA 自动选择一个最适合底层数据库的主键生成策略:SqlServer对应identity,MySQL 对应 auto increment。 
在javax.persistence.GenerationType中定义了以下几种可供选择的策略: 
–IDENTITY:采用数据库ID自增长的方式来自增主键字段,Oracle 不支持这种方式;
–AUTO: JPA自动选择合适的策略,是默认选项; 
–SEQUENCE:通过序列产生主键,通过@SequenceGenerator 注解指定序列名,MySql不支持这种方式 
–TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。

推荐的两种写法: 
属性之上:

 

@Table(name="CUSTOMERS")
@Entity
public class Customer {
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Id
    private Integer id;
    private String name;
    private String email;
    private int age;
 
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }

 

 

getter方法之上

 

@Table(name="CUSTOMERS")
@Entity
public class Customer {
    private Integer id;
    private String name;
    private String email;
    private int age;
 
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Id
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }

 但是不能某个注解在属性之上,某个注解在getter之上,将抛出异常,对其他注解也相同

 

 

@Table(name="CUSTOMERS")
@Entity
public class Customer {
    @Id
    private Integer id;
    private String name;
    private String email;
    private int age;
 
    @GeneratedValue(strategy=GenerationType.AUTO)
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }

 上面的写法是错误的

 

@Column: 
当实体的属性与其映射的数据库表的列不同名时需要使用@Column 标注说明,该属性通常置于实体的属性声明语句之前,还可与 @Id 标注一起使用。
@Column 标注的常用属性是name,用于设置映射数据库表的列名。此外,该标注还包含其它多个属性,如:unique、nullable、length 等。 
@Column 标注的columnDefinition属性: 表示该字段在数据库中的实际类型.通常 ORM 框架可以根据属性类型自动判断数据库中字段的类型,但是对于Date类型仍无法确定数据库中字段类型究竟是DATE,TIME还是TIMESTAMP.此外,String的默认映射类型为VARCHAR,如果要将 String 类型映射到特定数据库的 BLOB 或TEXT字段类型.
@Column标注也可置于属性的getter方法之前

name属性: 
name属性定义了被标注字段在数据库表中所对应字段的名称

unique属性: 
unique属性表示该字段是否为唯一标识,默认为false。 
如果表中有一个字段需要唯一标识,则既可以使用该标记,也可以使用@Table注解中的@UniqueConstraint,详情可参考@Table注解 详解

nullable属性: 
nullable属性表示该字段是否可以为null值,默认为true

insertable属性: 
insertable属性表示在使用”INSERT”语句插入数据时,是否需要插入该字段的值

updateable属性: 
updateable属性表示在使用”UPDATE”语句插入数据时,是否需要更新该字段的值

insertable和updateable属性一般多用于只读的属性,例如主键和外键等,这些字段通常是自动生成的

columnDefinition属性: 
columnDefinition属性表示创建表时,该字段创建的SQL语句,一般用于通过Entity生成表定义时使用 
如果数据库中表已经建好,该属性没有必要使用

table属性: 
table属性定义了包含当前字段的表名

length属性: 
length属性表示字段的长度,当字段的类型为varchar时,该属性才有效,默认为255个字符

precision属性和scale属性: 
precision属性和scale属性一起表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数

columnDefinition属性的使用:

@Table(name = "CUSTOMERS")
@Entity
public class Customer {
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Integer id;
    @Column(name = "Name")
    private String name;
    @Column(name = "Email",columnDefinition="varchar(128) not null")
    private String email;
    @Column(name = "Age")
    private int age;
    ......
}
 数据库DDL:

 

 

CREATE TABLE `customers` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Age` int(11) DEFAULT NULL,
  `Email` varchar(128) NOT NULL,
  `Name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
 columnDefinition可以指定创建表时一些SQL语句,比如这里可以一次性指定,varchar长度128,且不能为空 

 

当然,相同的结果可以通过nullable和length属性结合实现

 

@Table(name = "CUSTOMERS")
@Entity
public class Customer {
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Integer id;
    @Column(name = "Name")
    private String name;
    @Column(name = "Email", nullable = true, length = 128)
    private String email;
    @Column(name = "Age")
    private int age;
    ......
}

 数据库DDL:

 

 

CREATE TABLE `customers` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Age` int(11) DEFAULT NULL,
  `Email` varchar(128) DEFAULT NULL,
  `Name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

 

CREATE TABLE `customers` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Age` int(11) DEFAULT NULL,
  `Email` varchar(128) DEFAULT NULL,
  `Name` varchar(255) DEFAULT NULL,
  `Remark` text,
  `Salary1` decimal(5,2) DEFAULT NULL,
  `Salary2` double DEFAULT NULL,
  `Salary3` decimal(5,2) DEFAULT NULL,
  `Salary4` decimal(5,2) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 columnDefinition属性的特殊使用: 

 

编程语言中字符串一般都用String表示,但是数据库中varcahr数值类型有长度限制,一旦需要大文本,则需要text数值类型
但是String类型默认映射的数值类型是varchar,columnDefinition可以进行额外指定

@Table(name = "CUSTOMERS")
@Entity
public class Customer {
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Integer id;
    @Column(name = "Name")
    private String name;
    @Column(name = "Email", nullable = true, length = 128)
    private String email;
    @Column(name = "Age")
    private int age;
    @Column(name = "Remark",columnDefinition="text")
    private String remark;

}

 数据库DDL:

 

 

CREATE TABLE `customers` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Age` int(11) DEFAULT NULL,
  `Email` varchar(128) DEFAULT NULL,
  `Name` varchar(255) DEFAULT NULL,
  `Remark` text,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

 remark列数值类型是text,而Name和Email默认是varcahr

 

控制浮点精度:

 

@Table(name = "CUSTOMERS")
@Entity
public class Customer {
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Integer id;
    @Column(name = "Name")
    private String name;
    @Column(name = "Email", nullable = true, length = 128)
    private String email;
    @Column(name = "Age")
    private int age;
    @Column(name = "Remark", columnDefinition = "text")
    private String remark;
 
    @Column(name = "Salary1", columnDefinition = "decimal(5,2)")
    private double salary1;
    @Column(name = "Salary2", precision = 5, scale = 2)
    private double salary2;
    @Column(name = "Salary3", columnDefinition = "decimal(5,2)")
    private BigDecimal salary3;
    @Column(name = "Salary4", precision = 5, scale = 2)
    private BigDecimal salary4;

}
 数据库DDL:
CREATE TABLE `customers` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Age` int(11) DEFAULT NULL,
  `Email` varchar(128) DEFAULT NULL,
  `Name` varchar(255) DEFAULT NULL,
  `Remark` text,
  `Salary1` decimal(5,2) DEFAULT NULL,
  `Salary2` double DEFAULT NULL,
  `Salary3` decimal(5,2) DEFAULT NULL,
  `Salary4` decimal(5,2) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 总结: 

1.double类型将在数据库中映射为double类型,precision和scale属性无效 
2.double类型若在columnDefinition属性中指定数字类型为decimal并指定精度,则最终以columnDefinition为准 
3.BigDecimal类型在数据库中映射为decimal类型,precision和scale属性有效 
4.precision和scale属性只在BigDecimal类型中有效

在核心的JPA API中没有定义Date类型的精度,数据库中表示Date类型的数据有DATE,TIME,TIMESTAMP三种精度,可通过@Temporal注解进行调整

 

@Table(name = "CUSTOMERS")
@Entity
public class Customer {
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Integer id;
    @Column(name = "Name")
    private String name;
    @Column(name = "Email")
    private String email;
    @Column(name = "Age")
    private int age;
    @Temporal(TemporalType.DATE)
    @Column(name="Birthday")
    private Date birthday;
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="CreateTime")
    private Date createTime;

}

 数据库DDL:

CREATE TABLE `customers` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Age` int(11) DEFAULT NULL,
  `Birthday` date DEFAULT NULL,
  `CreateTime` datetime DEFAULT NULL,
  `Email` varchar(255) DEFAULT NULL,
  `Name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 当然@Column的columnDefinition属性也可以实现相同的效果

@Table(name = "CUSTOMERS")
@Entity
public class Customer {
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Integer id;
    @Column(name = "Name")
    private String name;
    @Column(name = "Email")
    private String email;
    @Column(name = "Age")
    private int age;
    @Column(name="Birthday",columnDefinition="date")
    private Date birthday;
    @Column(name="CreateTime",columnDefinition="datetime")
    private Date createTime;
 
}

 @Transient: 

表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性.
如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic

当实体对象中有一些独有属性时,可以使用该注解,进行忽略

@Table(name = "CUSTOMERS")
@Entity
public class Customer {
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Integer id;
    @Column(name = "Name")
    private String name;
    @Column(name = "Email")
    private String email;
    @Column(name = "Age")
    private int age;
    @Transient
    private String address;
 
}

 数据库DDL:

CREATE TABLE `customers` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Age` int(11) DEFAULT NULL,
  `Email` varchar(255) DEFAULT NULL,
  `Name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 数据库表中不会创建address列

 

转载地址:http://blog.csdn.net/Rickesy/article/category/6116937

分享到:
评论

相关推荐

    Hibernate中数据类型

    在Java编程语言中,我们使用各种数据类型来表示不同类型的数据,如整数、浮点数、字符、布尔值等。然而,在与数据库交互时,这些数据类型需要与数据库中的相应字段类型进行映射。Hibernate,作为一款流行的Java持久...

    JPA 批注参考-精心整理版

    - **@Temporal**: 用于日期时间类型的字段,指定如何转换成数据库中的日期时间类型。 - **@Enumerated**: 将枚举类型映射到数据库中的字符串或整数。 - **@Transient**: 标记一个不参与持久化的字段。 ##### 2. ...

    关于在Hibernate中对于Clob,Blob字段的处理方法

    对于Clob类型,你还可以选择使用`@Column(columnDefinition = "LONGTEXT")`或`@Column(columnDefinition = "NCLOB")`来指定存储类型。Blob类型通常默认为BLOB,但也可以根据需要进行调整。 在Oracle数据库中,处理...

    Hibernate4实战资料

    本文将深入探讨Hibernate4注解配置的相关知识点,包括@Entity、@Table、@Id、@GeneratedValue、@Column、@Version等核心注解的使用。 首先,我们来看@Entity注解,它是将一个普通的Java类声明为一个实体Bean,这个...

    HibernateAnnotation

    - `columnDefinition`:列的定义,如类型、大小等。 - `table`:表名(当与类上的 `@Table` 注解结合使用时)。 - `length`:列的最大长度。 - `precision` 和 `scale`:对于数值类型,分别表示精度和小数位数。 ...

    Hibernate4之JPA规范配置详解

    以上就是Hibernate4中关于JPA规范配置的详细介绍,包括了 `@Table`、`@SecondaryTable`、`@SecondaryTables`、`@UniqueConstraint`、`@Column` 和 `@JoinColumn` 等注解的主要用途和示例代码。通过对这些注解的理解...

    Hibernate_实体类_注解_说明

    **`@Column`**:提供了对数据库字段的详细配置能力,如`name`(字段名)、`nullable`(是否允许空值)、`unique`(是否唯一)、`length`(长度限制)、`insertable`与`updateable`(是否参与插入或更新操作)以及`...

    Hibernate4实战之Hibernate4注解零配置

    在Java的ORM框架Hibernate4中,注解零配置是一种简化持久化对象(POJOs)映射的方法,它允许开发者避免使用XML配置文件,而是直接在Java类和属性上使用注解来描述数据库表和字段的映射关系。以下是关于Hibernate4...

    java中(注解符)处理Clob(blob)类型

    其中,@Column 注解用于指定该字段的名称和类型,而 @Type 注解用于指定该字段的类型为 BlobByteArrayType,这是一个 Spring 提供的特殊类型,用于处理大规模二进制数据。 三、在 Spring 中配置 Blob 类型 在 ...

    hibernate注解说明

    Hibernate 还提供了其他一些注解,如 `@ManyToOne`、`@OneToOne`、`@OneToMany` 和 `@ManyToMany` 用于处理关联关系,`@Temporal` 用于处理日期时间类型的映射,`@JoinColumn` 用于指定关联字段的详细信息等。...

    hibernate注解说明文档

    ### Hibernate注解详解 #### 一、概述 Hibernate是一个开源的对象关系映射(ORM)框架,用于Java应用程序中实现数据库操作。它通过提供强大的映射工具和服务,将面向对象的数据模型映射到基于SQL的关系数据库中。...

    Hibernate注解大全

    - `hilo`:需要在数据库中建立一张额外的表,默认表名为`hibernate_unique_key`,字段类型为`integer`,名称为`next_hi`。 - `assigned`:主键由程序处理,默认生成策略。等同于JPA中的`AUTO`。 - **示例**: ```...

    Hibernate操作Oarcle中Clob、Blob字段小结

    - 对于Clob,可以使用`@Column(columnDefinition = "CLOB")`进一步指定数据库中的列类型。 3. **操作Clob和Blob**: - 插入数据:在保存实体时,Hibernate会自动处理Clob和Blob对象的序列化。可以通过`getClob()`...

    hibernate注解配置

    - `columnDefinition`:可选,指定列的SQL定义,例如类型或默认值,适用于所有数据库类型,但在不同数据库间可能有所差异。 - `table`:可选,指定列所属的表名,默认为实体类映射的表名。 - `length`:可选,...

    Hibernate全部注解

    ### Hibernate 全部注解详解 #### 一、概述 Hibernate 是一款开源的对象关系映射 (ORM) 框架,允许开发人员...此外,Hibernate 还提供了更多的高级特性,如关联映射、查询语言等,有兴趣的读者可以进一步学习和探索。

    关于Hibernate3中文查询出错问题的解决

    - 如果使用注解方式,对于存储中文的字段,可以使用`@Column(columnDefinition = "VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci")`来指定字段的字符集。 4. **SQL语句处理**: - 在编写HQL或...

    Hibernate_实体类_注解_大全

    `insertable`和`updateable`控制字段在INSERT和UPDATE语句中的行为,而`columnDefinition`则用于指定字段在数据库中的具体数据类型。 7. `@Transient`: 当一个属性不需要映射到数据库表的字段时,使用此注解。ORM...

    JPA完成单表注解配置说明包括日期,大文本,二进制文本,枚举

    本篇文章将深入探讨如何使用JPA进行单表注解配置,涵盖日期、大文本、二进制文本以及枚举类型的处理。我们将通过具体的例子来说明这些概念,并参考一个名为“JPA_Dome”的压缩包文件中的示例代码。 首先,我们需要...

    geometry类型与数据库做映射的包

    @Column(name = "location", columnDefinition = "Geometry") private Point location; // getters and setters } ``` 这里的`@Type(type = "org.hibernate.spatial.GeometryType")`注解告诉Hibernate这个字段...

Global site tag (gtag.js) - Google Analytics