【发布时间】:2011-03-14 14:20:33
【问题描述】:
我的基本问题是:如何强制 Hibernate 使 float 为 NULLable 并分别为 float、datetime、blob 接受 NULL?我的意思是 NULL,而不是 (float) 0.0。
更糟糕的是,当我尝试使用实体管理器存储所需的 NULLable 字段实际上为 NULL 的对象时,我收到属性错误,即使在 db 表中也被 Hibernate 标记为 NULLable。
这是我一直在徒劳的尝试:
考虑这张表:
+--------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| number | float | YES | | NULL | |
| url | varchar(3) | YES | | NULL | |
| mydate | date | YES | | NULL | |
+--------+--------------+------+-----+---------+----------------+
由这些语句创建:
DROP SCHEMA IF EXISTS `mydb` ;
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
USE `mydb` ;
DROP TABLE IF EXISTS `mydb`.`test` ;
CREATE TABLE IF NOT EXISTS `mydb`.`test` (
`id` INT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR(255) NOT NULL ,
`number` FLOAT NULL,
`url` VARCHAR(3) NULL ,
`mydate` DATE NULL ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `id_UNIQUE` (`id` ASC) )
ENGINE = InnoDB;
如果我执行以下插入:
INSERT INTO `mydb`.`test` (`name`) VALUES ('MyName');
SELECT * FROM `mydb`.`test`;
我得到以下结果:
+----+--------+--------+------+--------+
| id | name | number | url | mydate |
+----+--------+--------+------+--------+
| 1 | MyName | NULL | NULL | NULL |
+----+--------+--------+------+--------+
1 row in set (0.00 sec)
这正是我想要的。
使用 Hibernate 3.5 / JPA2,我尝试这样做我的 ORM:
博:
public class BodyStat extends BusinessObject {
@Id
private int id;
private String name;
@Column(nullable = true)
private float number;
@Column(nullable = true)
private URL url;
@Column(nullable = true)
private Date myDate;
... C'Tor / setters / getters / eof
我的 orm.xml 中的实体如下所示:
<entity class="test">
<table name=""test""/>
<attributes>
<id name="id">
<generated-value strategy="TABLE"/>
</id>
<basic name="name"/>
<basic name="number" optional="true"/>
<basic name="url" optional="true"/>
<basic name="myDate" optional="true"/>
</attributes>
</entity>
现在Hibernate生成的表是这样的:
+--------+--------------+------+-----+---------+------------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+------------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(255) | NO | | NULL | |
| number | float | NO | | NULL | |
| url | tinyblob | YES | | NULL | |
| mydate | date | YES | | NULL | |
+--------+--------------+------+-----+---------+------------+
这不是我想要的。如您所见
- float 不能为空,
- “url”类型变成了 blob 而不是 varchar 和
- mydate 作为“日期”而不是“日期时间”
【问题讨论】:
标签: java hibernate orm jpa nullable