`

转载:使用JPA生成实体类后,主键每次插入,数量按50递增,数据库:oracle,主键递增方式:sequence

    博客分类:
  • JAVA
 
阅读更多

作者:ghl116

 

Java Persistence API 简称JPA,它是作为EJB3.0规范( )中的附加持久规范而被开发出来。Hibernate3也使用JPA Annotation来替代以前hbm配置文件,在新项目使用了一下,感觉非常方便。但这几天出现了一个奇怪的问题。
@Entity()
@Table(name = "user_score_history")
public class UserScoreHistoryVO implements Serializable {
private int id;
private int userId;
private int scoreChange;
private int levelChange;
private String changeReason;
private String parameters;
private Timestamp createTime;

@Id
@SequenceGenerator(name="seq_user_score_history_id",sequenceName = "seq_user_score_history_id")
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "seq_user_score_history_id")
public int getId() {
return id;
}
...
}
但是每次保存新对象时都发现id都不对,与定义的sequence不一致,每一次都起始的id值都是50的倍数,而日志里看插入时也有调用sequence的sql语句。到网上查了一下,也没有结果。郁闷!看到一个对JPA的介绍
@SequenceGenerator如果使用 批注指定一个 SEQUENCE 类型的主键生成器,则可以使用 @SequenceGenerator 批注微调该主键生成器以:
更改分配大小以匹配应用程序要求或数据库性能参数
更改初始值以匹配现有的数据模型(例如,如果基于已经为其分配或保留了一组主键值的现有数据集构建)
使用现有数据模型中预定义的序列
列出了此批注的属性。有关更多详细信息,请参阅 。有关更多详细信息,请参阅 。
表 1-42 @SequenceGenerator 属性
属性必需说明name


SequenceGenerator 的名称必须匹配其 startegy 设置为 SEQUENCE 的 GeneratedValue 的名称。
allocationSize


默认值: 50.
默认情况下,JPA 持续性提供程序使用的分配大小为 50。
如果此分配大小与应用程序要求或数据库性能参数不匹配,请将 allocationSize 设置为所需的 int 值。
initialValue


默认值: 0.
默认情况下,JPA 持续性提供程序假设持续性提供程序将所有主键值的起始值设置为 0。
如果这与现有数据模型不匹配,请将 initialValue 设置为所需的 int 值。
sequenceName


默认值:JPA 持续性提供程序分配它自己创建的序列名。
如果要使用事先存在或预定义的序列,请将 sequenceName 设置为所需的 String 名称。

allocationSize默认值: 50???是不是这个,试着把allocationSize = 1加入@SequenceGenerator,果然就对了。
唉,这个世界连sun都不能相信了,还能相信谁啊!

 

分享到:
评论
3 楼 snakeaiyu 2013-12-31  
  
2 楼 qingfengxia 2013-04-16  
非常感谢,我也遇到了. 
1 楼 wentao_tang 2012-10-18  
我也遇到这个问题了  学习了

相关推荐

    持久化类主键生成策略+例子

    4. **`GenerationType.TABLE`**:使用一个单独的数据库表来生成主键值,适用于多线程环境,避免了序列和Identity策略可能遇到的并发问题。 ### Hibernate主键生成策略 1. **`native`**:类似于JPA的`...

    Oracle中主键自增实例

    然而,与MySQL等其他数据库不同,Oracle并没有内置的自动递增(auto-increment)功能来生成主键的序列值。但在实际应用中,我们可以通过一些技巧实现类似的功能。以下是一些关于在Oracle中创建主键自增实例的方法和...

    使用表的id生成

    `SEQUENCE`适用于支持序列的数据库,如Oracle,而`TABLE`策略则使用一个独立的表来管理主键生成。 2. **自定义ID生成器**: 当内置策略无法满足需求时,开发者可以创建自定义的ID生成器。这可能涉及到从特定的...

    解决spring自增型主键问题

    - **GenerationType.SEQUENCE**:对于支持序列的数据库(如Oracle),使用数据库的序列来生成主键,提供了一种高性能的解决方案。 - **GenerationType.AUTO**:由持久化管理器根据其自身的能力和配置来选择合适的...

    JPA的Id注解.docx

    - **GenerationType.TABLE**:使用一个独立的数据库表来生成主键。 - **GenerationType.SEQUENCE**:基于数据库序列生成主键,比如在Oracle数据库中。 - **GenerationType.IDENTITY**:依赖于数据库的自动递增特性,...

    Hibernate_JPA

    - `GenerationType.SEQUENCE`:使用序列(如 Oracle 或 PostgreSQL)生成主键,需要数据库支持序列。 示例代码: ```java @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private int userId; ``` ...

Global site tag (gtag.js) - Google Analytics