【问题标题】:@Id in hibernate@Id 在休眠中
【发布时间】:2014-11-25 05:15:29
【问题描述】:

我有一些代码

@Entity
@Table(name = "USER")
public class User {

    @Id
    @Column(name = "id", nullable = false, unique = true)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

当我尝试将用户添加到表时,我抓住了

org.h2.jdbc.JdbcSQLException: NULL not allowed for column "ID"; SQL statement:
insert into USER (id, birthday, email, first_name, last_name, login, password, id_role) values (null, ?, ?, ?, ?, ?, ?, ?) [23502-181]

这是我将用户添加到数据库的代码

stock2.setBirthday(new Date(46));
stock2.setEmail("sss");
stock2.setFirstName("oleg");
stock2.setId(506l);
stock2.setLastName("gubov");
stock2.setLogin("OP");
stock2.setPassword("1");
Role role2 = new Role();
role2.setName("poil");
role2.setId(7l);
stock2.setRole(role2);

HibernateUserDao dao = new HibernateUserDao();
System.out.println(stock2.getId() + " -----------before");
dao.create(stock2);

及创建方法代码:

public void create(User user) {

    Session session = null;
    try {
        session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        session.save(user);
        session.getTransaction().commit();
    } catch (Exception e) {
        session.getTransaction().rollback();
        throw e;
    } finally {
        if (session != null && session.isOpen()) {
            session.close();
        }
    }
}

在我看来,id 是 7,但不是 NULL。 而“java”则不然。问题出在哪里?

【问题讨论】:

  • 首先,我想您的代码块缺少以下行:User stock2 = new User();。这将导致您期望的 id 是 506 而不是 7(因为 stock2.setId(506l);)。对吗?

标签: java database hibernate


【解决方案1】:

这是描述您的问题并提出可能的解决方案的链接:http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Common_Problems_4

摘录:

null 被插入到数据库中,或者插入时出错。

[...] 也可能是您没有将表中的主键列设置为身份类型。

【讨论】:

    【解决方案2】:

    您调用dao.create(),因此您的意图是将行插入数据库。为什么在插入自己的id 时使用GenerationType.IDENTITY

    GenerationType.IDENTITY 表示您的JPA Provider 将使用表的IDENTITY 列(因此,id 将在数据库端分配)。 Hibernate 知道这一点,不会在 SQL 语句中发送您的 id

    顺便说一句,它不是生成 id 的最佳选择。 GenerationType.IDENTITY 存在一些性能问题(它不支持预分配,JPA Provider 可能会在每个插入行之后进行SELECT 查询,只是为了知道生成的id 是什么)。

    为了能够将您自己的值插入为ids,您只需删除@GeneratedValue(这实际上意味着您希望自动生成ids)注释。

    【讨论】:

      【解决方案3】:

      User 是大多数数据库引擎上的保留关键字,因此请更改:

      @Table(name = "USER")
      

      @Table(name = "APP_USER")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-30
        • 2013-09-14
        • 2023-03-11
        • 2012-02-16
        • 1970-01-01
        • 2012-03-21
        • 2011-07-16
        相关资源
        最近更新 更多