论坛首页 Java企业应用论坛

Hibernate使用SEQUENCE序列器生成主键ID的问题!

浏览 21548 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-03-29  

BaseEntity.java

java 代码
  1. /* DefaultEntity.java  
  2.  * --------------------------------------  
  3.  * CREATED ON 2006-8-12 下午06:23:34  
  4.  *  
  5.  * MSN arden.emily@msn.com  
  6.  * QQ 103099587(太阳里的雪)  
  7.  * MOBILE 13590309275  
  8.  *  
  9.  * ALL RIGHTS RESERVED BY ZHENUU CO,.LTD.  
  10.  * --------------------------------------  
  11.  */  
  12. package com.heqin.orm;   
  13.   
  14. import java.io.Serializable;   
  15.   
  16. import javax.persistence.GeneratedValue;   
  17. import javax.persistence.GenerationType;   
  18. import javax.persistence.Id;   
  19. import javax.persistence.MappedSuperclass;   
  20. import javax.persistence.Transient;   
  21.   
  22. import com.heqin.util.GenericsUtils;   
  23.   
  24. /**  
  25.  * 实体对象(封装了一些数据库操作的方法)  
  26.  *  
  27.  * @author <a href="arden.emily@gmail.com">arden</a>  
  28.  */  
  29. @MappedSuperclass  
  30. public abstract class BaseEntity<T> implements Serializable {          
  31.        
  32.     @Id  
  33.     @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_STORE")   
  34.     protected Long id;   
  35.        
  36.     public Long getId() {return id;}   
  37.   
  38.     public void setId(Long id) {   
  39.         this.id = id;   
  40.     }   
  41.        
  42.     @SuppressWarnings("unchecked")   
  43.     @Transient  
  44.     public String getClassName() {   
  45.         Class<T> entityClass = GenericsUtils.getSuperClassGenricType(getClass());   
  46.         return entityClass.getName();   
  47.     }   
  48. }  

 

User.java

java 代码
  1. /* User.java  
  2.  * --------------------------------------  
  3.  * CREATED ON 2007-3-20上午10:31:23  
  4.  *  
  5.  * MSN ardenemily@msn.com  
  6.  * QQ 83058327(太阳里的雪)  
  7.  * MOBILE 13590309275  
  8.  * BLOG http://www.ugole.com  
  9.  *  
  10.  * ALL RIGHTS RESERVED BY ZHENUU CO,.LTD.  
  11.  * --------------------------------------  
  12.  */  
  13. package com.heqin.model;   
  14.   
  15. import javax.persistence.Column;   
  16. import javax.persistence.Entity;   
  17. import javax.persistence.SequenceGenerator;   
  18. import javax.persistence.Table;   
  19.   
  20. import com.heqin.orm.BaseEntity;   
  21.   
  22. /**  
  23.  * 用户模型  
  24.  *   
  25.  * @author <a href="arden.emily@gmail.com">arden</a>  
  26.  */  
  27. @SuppressWarnings("serial")   
  28. @Entity  
  29. @Table(name="xp_users")   
  30. @SequenceGenerator(name="SEQ_STORE", sequenceName="xp_user_sequence")   
  31. public class User extends BaseEntity<User> {   
  32.     private String mid;   
  33.        
  34.     private String name;   
  35.   
  36.     @Column(name="nick_name")   
  37.     private String nickName;   
  38.   
  39.     private String password;   
  40.   
  41.     private String mobile;   
  42.   
  43.     private String email;   
  44.   
  45.     public String getEmail() {   
  46.         return email;   
  47.     }   
  48.   
  49.     public void setEmail(String email) {   
  50.         this.email = email;   
  51.     }   
  52.   
  53.     public String getMobile() {   
  54.         return mobile;   
  55.     }   
  56.   
  57.     public void setMobile(String mobile) {   
  58.         this.mobile = mobile;   
  59.     }   
  60.   
  61.     public String getName() {   
  62.         return name;   
  63.     }   
  64.   
  65.     public void setName(String name) {   
  66.         this.name = name;   
  67.     }   
  68.   
  69.     public String getNickName() {   
  70.         return nickName;   
  71.     }   
  72.   
  73.     public void setNickName(String nickName) {   
  74.         this.nickName = nickName;   
  75.     }   
  76.   
  77.     public String getPassword() {   
  78.         return password;   
  79.     }   
  80.   
  81.     public void setPassword(String password) {   
  82.         this.password = password;   
  83.     }   
  84.   
  85.     public String getMid() {   
  86.         return mid;   
  87.     }   
  88.   
  89.     public void setMid(String mid) {   
  90.         this.mid = mid;   
  91.     }   
  92. }   

 

Resource.java

java 代码
  1. /* Resource.java  
  2.  * --------------------------------------  
  3.  * CREATED ON 2007-3-15 上午 上午11:47:33  
  4.  *  
  5.  * MSN ardenemily@msn.com  
  6.  * QQ 83058327(太阳里的雪)  
  7.  * MOBILE 13590309275  
  8.  * BLOG http://www.ugole.com  
  9.  *  
  10.  * ALL RIGHTS RESERVED BY ZHENUU CO,.LTD.  
  11.  * --------------------------------------  
  12.  */  
  13. package com.heqin.model;   
  14.   
  15. import javax.persistence.MappedSuperclass;   
  16. import javax.persistence.Column;   
  17.   
  18. import com.heqin.orm.BaseEntity;   
  19.   
  20. /**  
  21.  * 资源模型  
  22.  *   
  23.  * @author <a href="arden.emily@gmail.com">arden</a>  
  24.  */  
  25. @MappedSuperclass  
  26. public abstract class Resource<T> extends BaseEntity<T> {   
  27.     private String title;   
  28.   
  29.     private String filename;   
  30.   
  31.     private String description;   
  32.        
  33.     @Column(name="filesize")   
  34.     private long fileSize;   
  35.   
  36.     public String getFilename() {   
  37.         return filename;   
  38.     }   
  39.   
  40.     public void setFilename(String filename) {   
  41.         this.filename = filename;   
  42.     }   
  43.   
  44.     public String getTitle() {   
  45.         return title;   
  46.     }   
  47.   
  48.     public void setTitle(String title) {   
  49.         this.title = title;   
  50.     }   
  51.   
  52.     public long getFileSize() {   
  53.         return fileSize;   
  54.     }   
  55.   
  56.     public void setFileSize(long fileSize) {   
  57.         this.fileSize = fileSize;   
  58.     }   
  59.   
  60.     public String getDescription() {   
  61.         return description;   
  62.     }   
  63.   
  64.     public void setDescription(String description) {   
  65.         this.description = description;   
  66.     }   
  67. }  

 

Viedo.java

java 代码
  1. /* Movie.java  
  2.  * --------------------------------------  
  3.  * CREATED ON 2007-3-15 上午 上午11:49:32  
  4.  *  
  5.  * MSN ardenemily@msn.com  
  6.  * QQ 83058327(太阳里的雪)  
  7.  * MOBILE 13590309275  
  8.  * BLOG http://www.ugole.com  
  9.  *  
  10.  * ALL RIGHTS RESERVED BY ZHENUU CO,.LTD.  
  11.  * --------------------------------------  
  12.  */  
  13. package com.heqin.model;   
  14.   
  15. import javax.persistence.Entity;   
  16. import javax.persistence.SequenceGenerator;   
  17. import javax.persistence.Table;   
  18.   
  19. /**  
  20.  * 视频资源  
  21.  *  
  22.  * @author <a href="arden.emily@gmail.com">arden</a>  
  23.  */  
  24. @SuppressWarnings("serial")   
  25. @Entity  
  26. @Table(name="xp_videos")   
  27. @SequenceGenerator(name="SEQ_STORE", sequenceName="xp_video_sequence")   
  28. public class Video extends Resource<Video> {   
  29. }  

 

我在Oracle数据库里相应的建了如上:xp_user_sequence, xp_video_sequence这么几个序列,可是发现在使用Hibernate的时候生成主键ID的什却没有根据Oracle数据库本身的自增,而是随机的自增,并且在Oracle数据库里用:select xp_user_sequence.netxtval from dual的时候发现序列的值根本就没有变化,这是什么原因?

   发表时间:2007-03-29  
可能sequence创建不正确
0 请登录后投票
   发表时间:2007-03-29  
序列是这样子创建的
CREATE SEQUENCE  "XP"."XP_VIDEO_SEQUENCE"  MINVALUE 1 MAXVALUE 99999999 INCREMENT BY 1 START WITH 81 CACHE 20 NOORDER  NOCYCLE ;

可是直接在数据库里用:
select xp_video_sequence.nextVal from dual确是正常按1自增的!
0 请登录后投票
   发表时间:2007-04-02  
你的问题我不太了解
但我可以告诉你hibernate在数据库中你的id是自动增长就可以把
<class name="com.fundback.datebase.Admin" table="Admin" schema="dbo" catalog="FundDb">
        <id name="id" type="java.lang.Integer">
            <column name="Id" />

....>>属性class="native",设置成当地的数据语法工作
            <generator class="native" />
如果我说的有错,请原谅!
那就请你去 forum.hibernate.org  问问他们
0 请登录后投票
   发表时间:2007-04-28  
把配置文件贴出来,在oracle里配置好sequence在配置文件里这样写就没问题了:
<class name="com.baosight.po.SentMessageXcom" table="SentMessageBufferlog">
   <id name="sentMessageid" column="SentMessageId" type="integer">
    <generator class="sequence">
    <param name="sequence">SEQ_SENT_MESSAGE</param>
   </generator>
    </id>
0 请登录后投票
   发表时间:2007-04-28  
我也遇到过这个问题,用hibernate annotation配置ID使用oracle的sequence时,sequence并不是oracle sequence中设置的加1,而是随机自增,不知道楼主解决了这个问题没?
0 请登录后投票
   发表时间:2007-07-11  

我的程序也是这样,不过解决了这个问题
在@SequenceGenerator中加入allocationSize = 1就可以了

 

@SequenceGenerator

如果使用 @GeneratedValue 批注指定一个 SEQUENCE 类型的主键生成器,则可以使用 @SequenceGenerator 批注微调该主键生成器以:

  • 更改分配大小以匹配应用程序要求或数据库性能参数

  • 更改初始值以匹配现有的数据模型(例如,如果基于已经为其分配或保留了一组主键值的现有数据集构建)

  • 使用现有数据模型中预定义的序列

表 1-42 列出了此批注的属性。有关更多详细信息,请参阅 。有关更多详细信息,请参阅 API

 

我要不知道为什么这样

0 请登录后投票
   发表时间:2007-08-30  
一般不推荐用sequence方式,因数这会让数据库多执行一次操作,最好用Hibernate的UUID生成主键,配置一下就行了.
<id name="goodsId" column="goods_id" type="java.lang.String" unsaved-value="null" length="36">
<generator class="uuid"/>
</id>
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics