column

@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类型
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值