读书人

一个简单的hibernate3 annotation有关

发布时间: 2012-01-16 23:36:51 作者: rapoo

一个简单的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"/>


</class>
</hibernate-mapping>

关键不知道你是用什么数据库,如果是建了sequence哪就要改为
<id name="id" column="id" type="Integer">
<generator class="sequence">
<param name="sequence">seq_APP_USER</param>
</generator>
</id>

读书人网 >J2EE开发

热点推荐