name的數據類型是nvarchar嗎?如果是改為varchar類型應該能運行,但是這個治標不治本,這是hibernate沒映射nvarchar
剛才整理了一下varchar和nvarchar的區別,然后用Hibernate映射到數據庫時,發現String類型被映射為了varchar,就在網上找了一下怎樣將String映射為nvarchar。
方法一:
對於String類型,你可能是這樣映射的
- private String name;
- @Column(length = 20 , nullable = false , unique = true)
- public String getName() {
- return name;
- }
查看數據庫,你會發現name字段應該是這樣 name varchar(20);
現在我們修改一下Annotation,讓他映射為 name nvarchar(20)
- private String name;
- @Column(length = 20 , nullable = false , unique = true , columnDefinition="nvarchar(20)")
- public String getName() {
- return name;
- }
再查看數據庫,你會發現現在應該是 name nvarchar(20);
注意:加上columnDefinition之后,length好像沒有作用了,必須要在columnDefinition的value中指定長度。
- private String name;
- @Column(nullable = false , unique = true , columnDefinition="nvarchar(20)")
- public String getName() {
- return 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(Optional) The SQL fragment that is used when generating the DDL for the column.
Defaults to the generated SQL to create a column of the inferred type.
Default:""
(摘)可選: 為這個特定字段覆蓋sql DDL片段 (這可能導致無法在不同數據庫間移植)
來源:http://hai0378.iteye.com/blog/2038872
