Мой основной вопрос: как заставить Hibernate сделать float NULLable и принять NULL для float, datetime, blob, соответственно? Я действительно имею в виду NULL, а не (float) 0.0.
Еще хуже, когда я пытаюсь сохранить объект с нужными NULLable полями, фактически равными NULL, и использую диспетчер сущностей, я получаю ошибки для атрибутов, которые 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 следующим образом:
BO:
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 | |
+--------+--------------+------+-----+---------+------------+
что не совсем то, что я хочу. Как видите
- число с плавающей запятой не допускается,
- тип "url" оказался как блоб, а не как varchar и
- mydate как "дата", а не "datetime"