我有一些代码
@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”则不这么认为。问题出在哪里?
您调用dao.create()
,因此您的意图是将行插入数据库。为什么GenerationType.IDENTITY
在插入自己的内容时使用id
?
GenerationType.IDENTITY
意味着您JPA Provider
将使用表的IDENTITY
列(因此,id
将在数据库一侧分配)。知道后,Hibernate将不会id
在SQL语句中发送您。
顺便说一句,它不是生成ID的最佳选择。GenerationType.IDENTITY
有一些性能问题(它不支持预分配,并且JPA Provider
可能SELECT
在插入的每一行之后进行查询,只是想知道生成的id
是什么)。
为了能够将您自己的值插入为id
s,您可以简单地将@GeneratedValue
其删除(这实际上意味着您需要id
s自动生成)注释。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句