@Column(name="columnName";boolean unique() default false;boolean nullable() default true;
boolean insertable() default true;boolean updatable() default true;
String columnDefinition() default "";
String table() default "";
int length() default 255;
int precision() default 0; // decimal precision
int scale() default 0; // decimal scale
name 可选,字段名(默认值是属性名)
unique 可选,是否在该字段上设置唯一约束(默认值false)
nullable 可选,是否设置该字段的值可以为空(默认值false)
insertable 可选,该字段是否作为生成的insert语句中的一个字段(默认值true)
updatable 可选,该字段是否作为生成的update语句中的一个字段(默认值true)
columnDefinition 可选: 为这个特定字段覆盖sql DDL片段 (这可能导致无法在不同数据库间移植)
table 可选,定义对应的表(默认为主表)
length 可选,字段长度(默认值255)
precision 可选,字段数字精精度(默认值0),表示数字中的有效位,如果没有指定precision的话,Oracle将使用38作为精度。
scale 可选,如果字段数字刻度可用,表示数字小数点右边的位数,如果把scale设成负数,Oracle将把该数字取舍到小数点左边的指定位数。在此设置(默认值0)
例如:
@Column(columnDefinition="int default 0",nullable=false,insertable=false,updatable=false)
Integer enMenuVerTag;//英文菜品是否已经校验 //0:未校验 1:已校验
@Column(columnDefinition="varchar(255) default 'x'",nullable=false,insertable=false,updatable=false)
String enMenuVerId;//英文菜品校验人
@Temporal(TemporalType.TIMESTAMP)
@Column(columnDefinition="TIMESTAMPTZ default '2009-01-01 00:00:00'",nullable=false,insertable=false,updatable=false)
Date enMenuVerTime;//英文菜品校验时间
@Column(name = "F_FileFuncType", columnDefinition = "char(1) default '' comment '文件类型:A建筑照片,B配电柜照片,C支路布置图,D部署方案'")
private char fileFuncType;
@Column(name = "F_FileDesc", nullable = true, columnDefinition = "varchar(80) default NULL comment '文件描述'")
private String fileDesc;
@Column(name = "F_FileSize", columnDefinition = "int default 0 comment '文件大小:单位byte'")
private int fileSize;
@Column(name = "F_FileDate", nullable = true, columnDefinition = "datetime COMMENT '上传时间'")
private Date fileDate;
@Column(name = "F_BuildLong", nullable = true, columnDefinition = "numeric(18,4) DEFAULT 0 COMMENT '建筑坐标-经度,建筑任意点的经度读数(默认为东经,单位为度,如131.2576度)'")
private BigDecimal buildLong;
@Column(name = "F_IsStandard", nullable = true, columnDefinition = "bit DEFAULT 0 COMMENT'是否是标杆建筑,False–否, default True–是'")
private boolean isStandard;
1.String映射为nvarchar
方法一:
Hibernate映射到数据库时,String类型被映射为了varchar
对于String类型,你可能是这样映射的
@Column(length = 20 , nullable = false , unique = true)
private String name;
查看数据库,你会发现name字段应该是这样 name varchar(20);
现在我们修改一下Annotation,让他映射为 name nvarchar(20)
@Column(length = 20 , nullable = false , unique = true , columnDefinition="nvarchar(20)")
private String name;
再查看数据库,你会发现现在应该是 name nvarchar(20);
注意:加上columnDefinition之后,length好像没有作用了,必须要在columnDefinition的value中指定长度。
@Column(nullable = false , unique = true , columnDefinition="nvarchar(20)")
private String name;
方法二:
继承SQLServerDialect ,写一个自己的,然后再xml中配置一下。
方法网址:http://stackoverflow.com/questions/1099413/how-can-hibernate-map-the-sql-data-type-nvarcharmax
public class SQLServerNativeDialect extends SQLServerDialect {
public SQLServerNativeDialect() {
super();
registerColumnType(Types.VARCHAR, "nvarchar($l)");
registerColumnType(Types.CLOB, "nvarchar(max)");
}
public String getTypeName(int code, int length, int precision, int scale) throws HibernateException {
if(code != 2005) {
return super.getTypeName(code, length, precision, scale);
} else {
return "ntext";
}
}
}
总结:
顺便查了一下columnDefinition,发现他可以设置默认值。Hibernate会把columnDefinition 的内容直接写在生成标的ddl中,因此语法必须正确。
@Column(columnDefinition="int default 0",nullable=false)
columnDefinition
public abstract java.lang.String columnDefinition
(摘)可选: 为这个特定字段覆盖sql DDL片段 (这可能导致无法在不同数据库间移植)
2.update
XML中设置property 标签 update = “false” ,如下:我们设置 state 这个属性在更改中不做更改
<property name=”state” update=”false”></property>
如有几个字段不做更改,需在相应property,增加update=”false”
在Annotation中 在属性GET方法上加上
@Column(updatable=false)
我们在执行 update方法会发现,state 属性 不会被更改。
缺点:不灵活。如需要有多个字段指定不同的组合修改时不适用。
3.int float定义
可以使用@colum注解中的columnDefinition属性
float:
@Column(columnDefinition="number(10,2)")
public float getPrice() {
return price;
}
int:
@Column(columnDefinition="number(2) default 0")
public int getSpecialPrice() {
return specialPrice;
}
4.bigdecimal
1)如果不指定number的长度,或指定长度n>18
id number not null,转换为pojo类时,为java.math.BigDecimal类型
2)如果number的长度在10 <= n <= 18
id number(n) not null,转换为pojo类时,为java.lang.Long类型
3)如果number的长度在1 <= n <= 9
id number(n) not null,转换为pojo类时,为java.lang.Integer类型