日期:2014-05-20  浏览次数:20856 次

一个简单的hibernate3 annotation问题:自动生成主键
大家好,我的问题是这样的,主键无法生成,请大家帮我看看。

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

  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
private Long id;

@Column(name = "FIRST_NAME")
private String firstName;

public void setId(Long id) {
this.id = id;
}

public Long getId() {
return id;
}

public void setFirstName(String firstName) {
this.firstName = firstName;
}

public String getFirstName() {
return firstName;
}
}

这样的话,在调用getHibernateTemplate().saveOrUpdate(user);的时候,始终无法插入记录,请问是否要对表做什么设置吗?

可是同样的表,以前用hbm.xml,就能够正常生成主键,并成功插入记录。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="org.appfuse.model.User" table="app_user">

<id name="id" column="id" unsaved-value="0">
<generator class="increment" />
</id>
<property name="firstName" column="first_name" not-null="true"/>
</class>
</hibernate-mapping>

请高手指点,谢谢!


------解决方案--------------------

------解决方案--------------------
<generator class="increment" /> 

VS

@GeneratedValue(strategy=GenerationType.AUTO) 

你看看区别。

你应该根据数据库选择合适的类型,比如 Identity
------解决方案--------------------
自增长在jpa中一般是identity

------解决方案--------------------
你数据库貌似 不是自动增长的。
------解决方案--------------------
探讨
用hbm.xml,是能够正常生成主键,并成功插入记录。
这次用annotation不知道为什么用注解就不行。

因为是刚开始做没什么经验,所以请有经验的同学指点一下,在做主键自动增长的时候,要注意些什么,注解应该怎么写。
这个问题搞了我好久了,请大家帮忙!

------解决方案--------------------
探讨
各位大哥,前面GenerationType.AUTO的时候,报错为:
org.hibernate.exception.SQLGrammarException: could not get next sequence value
java.sql.SQLException: ORA-02289: 序列(号)不存在

现在改成GenerationType.IDENTITY,出错信息为:
org.hibernate.exception.ConstraintViolationException: could not insert: [demo.model.User]
java.sql.SQLException: ORA-01400: 无法将 NULL 插入 ("TEST"."APP_USER".…

------解决方案--------------------
我记得用SEQUENCE类型的话要在表中建立一个序列表~
------解决方案--------------------
你在oracle里面首先要建立个SEQUENCE
然后代码中用 SEQUENCE 方式
------解决方案--------------------
改成这样试试
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> 
<hibernate-mapping> 
<class name="org.appfuse.model.User" table="app_user"> 

<id name="id" column="id" unsaved-value="0"> 
<generator class="native" /> 
</id> 
<property name="firstName" column="first_name" not-null="true"/>