为什么Hibernate Hi-Lo算法策略将序列乘以50?

时间:2019-04-24 15:00:58

标签: hibernate

我正在使用 Hibernate 5.3.7 。将hibernate.id.new_generator_mappings的默认值从true设置为false后,将解决唯一性约束错误。

但是面对ID创建的另一种行为:

Hibernate生成的ID =(50 *(Oracle序列的start_with)值)+ 1

这是Hilo算法的默认行为吗?

谢谢。

建议的方法-https://hibernate.atlassian.net/browse/HHH-10983

Hi- Lo:https://vladmihalcea.com/the-hilo-algorithm/

我可以读取hat hi和lo值, [(hi -1)* crementSize)+ 1,(hi * incrementSize)) 默认情况下,incrementSize为50。

将start_with值乘以50的原因是什么?

例如:

我有一个表的序列起始值为5000

然后我的Hibernate应用程序将从(5000 * 50)= 250000开始

合并策略-以唯一约束例外结束

还有:如何在使用的id上传达Oracle序列?

根据该网站,id的缺口是正常的:

https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:369390500346406705

1 个答案:

答案 0 :(得分:1)

解决方案:

public class CustomProgressbar extends RelativeLayout { private TextView titleText; private TextView valueText; private ProgressBar progressBar; public CustomProgressbar(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs); } private void init(Context context, AttributeSet attrs) { inflate(context, R.layout.custom_progressbar_layout, this); TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomProgressbar); CharSequence title = typedArray.getText(R.styleable.CustomProgressbar_title); CharSequence value = typedArray.getText(R.styleable.CustomProgressbar_value); int progress = typedArray.getInteger(R.styleable.CustomProgressbar_progress, 0); typedArray.recycle(); titleText = findViewById(R.id.title_text); valueText = findViewById(R.id.value_text); progressBar = findViewById(R.id.progressbar_attr); setTitleText(title); setValueText(value); setProgressBar(progress); } public CharSequence getTitleText() { return titleText.getText(); } public CharSequence getValueText() { return valueText.getText(); } public int getProgressBar() { return progressBar.getProgress(); } public void setTitleText(CharSequence value) { titleText.setText(value); } public void setValueText(CharSequence value) { valueText.setText(value); } public void setProgressBar(int value) { progressBar.setProgress(value); }

收到如下警告:

发现使用了不推荐使用的基于序列的[org.hibernate.id.SequenceHiLoGenerator] ID生成器;请改用org.hibernate.id.enhanced.SequenceStyleGenerator。有关详细信息,请参见《 Hibernate域模型映射指南》。

然后将我的代码更改为SequenceStyleGenerator:

@Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = SEQUENCE) @SequenceGenerator(name = SEQUENCE, sequenceName = SEQUENCE) private Long titId;

这解决了我的两个问题:

1)已弃用的警告已修复2)现在,根据oracle序列生成了id。