powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Непонятное поведение при saveOrUpdate: SQLException: Field '...' doesn't have a default va
3 сообщений из 3, страница 1 из 1
Непонятное поведение при saveOrUpdate: SQLException: Field '...' doesn't have a default va
    #38635046
mr.Jack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте,
Посмотрите пожалуйста свежим взглядом, что не так?
Есть такие таблицы

ROLE
Код: sql
1.
2.
3.
4.
5.
CREATE TABLE IF NOT EXISTS `mydb`.`ROLE` (
  `ID` BIGINT NOT NULL AUTO_INCREMENT,
  `ROLE_NAME` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`ID`))
ENGINE = InnoDB


USER
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TABLE IF NOT EXISTS `mydb`.`USER` (
  `ID` BIGINT NOT NULL AUTO_INCREMENT,
  `LOGIN` VARCHAR(45) NOT NULL,
  `PASSWORD` VARCHAR(45) NOT NULL,
  `IS_ACTIVE` TINYINT(1) NOT NULL DEFAULT false,
  `ROLE_ID` BIGINT NOT NULL,
  PRIMARY KEY (`ID`),
  INDEX `fk_USER_ROLE1_idx` (`ROLE_ID` ASC),
  CONSTRAINT `fk_USER_ROLE1`
    FOREIGN KEY (`ROLE_ID`)
    REFERENCES `mydb`.`ROLE` (`ID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB


USER_DETAILS
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE TABLE IF NOT EXISTS `mydb`.`USER_DETAILS` (
  `ID` BIGINT NOT NULL AUTO_INCREMENT,
  `FIRST_NAME` VARCHAR(45) NULL,
  `LAST_NAME` VARCHAR(45) NULL,
  `EMAIL` VARCHAR(45) NULL,
  `DATE_REG_TIMESTAMP` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `PAY_CODE` VARCHAR(45) NULL,
  `MONEY` DECIMAL(6,2) NOT NULL DEFAULT 0.0000,
  `INVITE_COUNT` INT NULL DEFAULT 0,
  `USER_ID` BIGINT NOT NULL,
  PRIMARY KEY (`ID`),
  INDEX `fk_USER_DETAILS_USER_idx` (`USER_ID` ASC),
  CONSTRAINT `fk_USER_DETAILS_USER`
    FOREIGN KEY (`USER_ID`)
    REFERENCES `mydb`.`USER` (`ID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB



Маппинги
Role.hbm.xml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.myapp.model.entity">
    <class name="com.myapp.model.entity.Role" table="ROLE">
        <id name="id" column="ID">
            <generator class="identity"/>
        </id>
        <property name="roleName" type="string" column="ROLE_NAME" />
        <set name="userCollection">
            <key>
                <column name="ROLE_ID" />
            </key>
            <one-to-many class="com.myapp.model.entity.User" />
        </set>
    </class>

    <query name="Role.getAll"><![CDATA[
        from Role
    ]]></query>
    <query name="Role.deleteById"><![CDATA[
        delete from Role r where r.id = id
    ]]></query>
</hibernate-mapping>



User.hbm.xml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.myapp.model.entity">
    <class name="com.myapp.model.entity.User" table="USER">
        <id name="id" column="ID">
            <generator class="identity"/>
        </id>
        <property name="login" type="string" column="LOGIN"/>
        <property name="password" type="string" column="PASSWORD"/>
        <property name="isActive" type="boolean" column="IS_ACTIVE"/>
        <many-to-one name="role" class="com.myapp.model.entity.Role" column="ROLE_ID" cascade="none" />
        <one-to-one name="userDetails" class="com.myapp.model.entity.UserDetails" cascade="save-update"/>
        <one-to-one name="activationCode" class="com.myapp.model.entity.ActivationCode"/>
        <set name="sessionCollection">
            <key>
                <column name="USER_ID" />
            </key>
            <one-to-many class="com.myapp.model.entity.Session"/>
        </set>
        <set name="fileCollection">
            <key>
                <column name="USER_ID" />
            </key>
            <one-to-many class="com.myapp.model.entity.File"/>
        </set>
        <set name="inviteCollection">
            <key>
                <column name="USER_ID" />
            </key>
            <one-to-many class="com.myapp.model.entity.Invite" />
        </set>
    </class>

    <query name="User.getAll"><![CDATA[
        from User
    ]]></query>
    <query name="User.deleteById"><![CDATA[
        delete from User u where u.id = :id
    ]]></query>
</hibernate-mapping>



UserDetails.hbm.xml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.myapp.model.entity">
    <class name="com.myapp.model.entity.UserDetails" table="USER_DETAILS">
        <id name="id" column="ID">
            <generator class="identity"/>
        </id>
        <property name="firstName" type="string" column="FIRST_NAME" />
        <property name="lastName" type="string" column="LAST_NAME" />
        <property name="email" type="string" column="EMAIL" />
        <property name="dateRegistration" type="timestamp" column="DATE_REG_TIMESTAMP" />
        <property name="payCode" type="string" column="PAY_CODE" />
        <property name="money" type="java.math.BigDecimal" column="MONEY" />
        <property name="inviteCount" type="integer" column="INVITE_COUNT" />
        <one-to-one name="user" class="com.myapp.model.entity.User" />
    </class>
</hibernate-mapping>



Сохраняю так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
        Role role = roleDao.get(1L);

        User user = new User();
        user.setRole(role);
        user.setIsActive(true);
        user.setLogin("CommonUser");
        user.setPassword("e899071ad51c959adfeed6e6627fe858");

        UserDetails userDetails = new UserDetails();
        userDetails.setDateRegistration(new Date());
        userDetails.setMoney(new BigDecimal(0));

        userDetails.setUser(user);
        user.setUserDetails(userDetails);

        userDao.saveOrUpdate(user); // на уровне DAO происходит getSession().saveOrUpdate(...);

        return userDao.get(1L);



Лог:
log4j insert
into
USER
(LOGIN, PASSWORD, IS_ACTIVE, ROLE_ID)
values
(?, ?, ?, ?)
21:57:43,437 TRACE BasicBinder:81 - binding parameter [1] as [VARCHAR] - [CommonUser]
21:57:43,438 TRACE BasicBinder:81 - binding parameter [2] as [VARCHAR] - [e899071ad51c959adfeed6e6627fe858]
21:57:43,438 TRACE BasicBinder:81 - binding parameter [3] as [BOOLEAN] - [true]
21:57:43,438 TRACE BasicBinder:81 - binding parameter [4] as [BIGINT] - [1]
21:57:43,448 DEBUG SQL:109 -
insert
into
USER_DETAILS
(FIRST_NAME, LAST_NAME, EMAIL, DATE_REG_TIMESTAMP, PAY_CODE, MONEY, INVITE_COUNT)
values
(?, ?, ?, ?, ?, ?, ?)
21:57:43,449 TRACE BasicBinder:69 - binding parameter [1] as [VARCHAR] - [null]
21:57:43,450 TRACE BasicBinder:69 - binding parameter [2] as [VARCHAR] - [null]
21:57:43,450 TRACE BasicBinder:69 - binding parameter [3] as [VARCHAR] - [null]
21:57:43,452 TRACE BasicBinder:81 - binding parameter [4] as [TIMESTAMP] - [Mon May 05 21:57:43 MSK 2014]
21:57:43,452 TRACE BasicBinder:69 - binding parameter [5] as [VARCHAR] - [null]
21:57:43,454 TRACE BasicBinder:81 - binding parameter [6] as [NUMERIC] - [0]
21:57:43,456 TRACE BasicBinder:81 - binding parameter [7] as [INTEGER] - [0]
21:57:43,457 WARN SqlExceptionHelper:144 - SQL Error: 1364, SQLState: HY000
21:57:43,458 ERROR SqlExceptionHelper:146 - Field 'USER_ID' doesn't have a default value


Откуда тут Field 'USER_ID' doesn't have a default value ?
...
Рейтинг: 0 / 0
Непонятное поведение при saveOrUpdate: SQLException: Field '...' doesn't have a default va
    #38635204
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У вас в базе USER_ID NOT NULL.
В маппинге же отсутсвутет указание nullable (если правильно помню).
<one-to-one name="user" class="com.myapp.model.entity.User" />
Поэтому хибер ничего не знает о том что порядок создания записией строго регулируется - сначала USER, потом USER_DETAILS.
По-умолчанию он делает наоборот и потом проставляет FK значения.
...
Рейтинг: 0 / 0
Непонятное поведение при saveOrUpdate: SQLException: Field '...' doesn't have a default va
    #38637191
mr.Jack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Спасибо Вам!
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Непонятное поведение при saveOrUpdate: SQLException: Field '...' doesn't have a default va
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]