关于annotation!希望路过的大侠指点指点!

sun9763 2011-09-08 08:06:40
以前一直用Xml配置类与数据表的映射,最近也了解了一下annotation,觉得挺方便的,也尝试着做了一下,但是在ID生成策略那里出了问题,我在数据库里建了一个vu_seq的sequence,从1开始,每次增加1.在实体类里也指定了具体的策略,测试的时候hibernate自动生成的sql语句也的确去找了这个sequence的下一个值的,但我断点的时候发现sequence的下一个值明明应该是1,可hibernate赋到Id的时候却变成了50,再次插入的时候就变成了100,而在数据库查出vu_seq的下一个值还是2,也就是说,hibernate在自动生成ID的时候的确是找了我创建的那个sequence,但却是从50开始了,而且每次增加的值也是50.我找了半天也找不出原因所在,在此把代码贴出来,希望各位路过的大侠帮忙看一下,感激不尽!
Oracle里的sequence:
create sequence vu_seq
start with 1
increment by 1
nomaxvalue
cache 10;

package com.accp.entity;
import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

@Entity
@Table(name="vote_user")
@SequenceGenerator(name="vu_seq",sequenceName="vu_seq")
public class User implements Serializable {

private static final long serialVersionUID = 1L;

private Integer id;
private String name;
private String password;


@Id
@Column(name="vu_user_id")
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="vu_seq")
public Integer getId() {
return id;
}
@Column(name="vu_user_name")
public String getName() {
return name;
}
@Column(name="vu_password")
public String getPassword() {
return password;
}
public void setId(Integer id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setPassword(String password) {
this.password = password;
}

}
sessionfactory:
<session-factory>

<!-- Database connection settings -->
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:Vote</property>
<property name="connection.username">accp</property>
<property name="connection.password">accp</property>

<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>

<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.OracleDialect</property>

<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>

<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>

<!-- Drop and re-create the database schema on startup -->
<!-- <property name="hbm2ddl.auto">update</property> -->

<!--<mapping resource="org/hibernate/tutorial/domain/Event.hbm.xml"/>-->

<mapping class="com.accp.entity.User"/>
</session-factory>

测试类:
public class SaveTest extends BaseDaoHibernateImpl {

public static void main(String[] args) {
User user=new User();
user.setName("123");
user.setPassword("123");
Session session=new SaveTest().getSession();
Transaction transaction=session.beginTransaction();
try {
session.save(user);
transaction.commit();
} catch (HibernateException e) {
// TODO: handle exception
transaction.rollback();
e.printStackTrace();
}
}

希望哪位大侠能够指点一下问题到底出在哪里,小弟在此谢了!
...全文
82 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
cjoy4856 2011-09-09
  • 打赏
  • 举报
回复
LZ使用的是本地化的一个sessionfactory 这个sessionfactory不支持@,因此需要使用具有@的sessionfactory ,如spring中提供了annotionSessionFactory 。我感觉hibernate中也提供了,但是你看spring的问题,文档中对于annnotionSessionFactory这个类没有进行讲解,因为spring官方认为这个方式不是很好,存在一些问题吧。不过你去查看文档吧。hibernate的文档中也对这个问题进行了讲说吧,只是都不多而已
sun9763 2011-09-09
  • 打赏
  • 举报
回复
问题解决了,原来不管数据库里的sequence初始值和自增长设置的多少,在annotation里都是默认的50,所以必须在类里面指定初始值和自增长才行。不过 3楼的大侠说的我也很感兴趣呀,能不能详细说一下什么叫本地化的sessionfactory呢?而具有@的sessionfactory又是什么啊?(PS:我还没开始学spring呢!)
2399 2011-09-08
  • 打赏
  • 举报
回复
看代码是没有问题的,lz多调试下。看看打印的sql语句
sun9763 2011-09-08
  • 打赏
  • 举报
回复
哪位大哥帮帮我吧,我刚学习annotation,指点指点我吧!

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧