hibernate 配置Oracle主键生成策略

	@Id
	@Column(name="[id]")
	@GeneratedValue(strategy = GenerationType.SEQUENCE,generator="seqhilo")
	@SequenceGenerator(sequenceName="userInfo_sequence", name = "seqhilo",allocationSize=1)
	private long id;
sequenceName="userInfo_sequence"

制定Oracle中的生成序列

以下是有可能出现的问题

作者: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都不能相信了,还能相信谁啊!


(个人微信号)  (技术公众号)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值