Hibernate中持久化的不同实体标识符

Hibernate中持久化的不同实体标识符,hibernate,Hibernate,当我创建一个没有ID的新实体并将其存储在数据库中时,实体会收到一个标识符,而不是数据库中的标识符。ID是通过oracle中的序列生成的。有什么建议可以解决吗?谢谢你的回复 示例:我创建DiReview review=new DiReview()。我正确设置了除id a之外的所有字段。我希望hibernate通过getSessionFactory()持久化。getCurrentSession()持久化()检查数据库,我希望hibernate设置正确的id。假设oracle序列生成的最后一个id是2

当我创建一个没有ID的新实体并将其存储在数据库中时,实体会收到一个标识符,而不是数据库中的标识符。ID是通过oracle中的序列生成的。有什么建议可以解决吗?谢谢你的回复

示例:我创建DiReview review=new DiReview()。我正确设置了除id a之外的所有字段。我希望hibernate通过getSessionFactory()持久化。getCurrentSession()持久化()检查数据库,我希望hibernate设置正确的id。假设oracle序列生成的最后一个id是25,所以我假设表Diu review中的新行是26。在persist和commit之后,表中实际存储了id为26的新行,但review中的to字段id设置了另一个数字。以我为例,比如2000年!!这是正常的吗

在我的例子中,这个问题不仅与DiReview有关,而且与我的所有实体有关。当我从数据库加载实体时,会加载corect id

编辑-我尝试使用oracle和sequence实现此功能,至少现在我知道这不是正常行为;-)

@实体
@表(name=“DI_REVIEW”,uniqueConstraints=@UniqueConstraint(columnNames={
“对象ID”、“用户ID”})
公共类DiReview{
私人长id;
私人用户;
私有对象;
私有字符串文本;
私人日期;
私有集评级=新哈希集(0);
私有集ReviewContext=新哈希集(
0);
private Collection reviewContextsList=new ArrayList();
私有集注释=新哈希集(0);
公共目录视图(){
}
公共目录视图(长id、DiUser用户、DiObject对象、字符串文本、,
日期(创建日期){
this.id=id;
this.user=用户;
this.object=对象;
this.text=文本;
this.createDate=createDate;
}
@身份证
@列(name=“ID”,unique=true,nullable=false,precision=18,scale=0)
@SequenceGenerator(name=“di_review_seq”,sequenceName=“di_review_seq”)
@GeneratedValue(策略=GenerationType.SEQUENCE,generator=“di_review_seq”)
公共长getId(){
返回此.id;
}
能手和二传手。。
@凌驾
公共int hashCode(){
最终整数素数=31;
int结果=1;
结果=素数*结果
+((createDate==null)?0:createDate.hashCode());
result=prime*result+((id==null)?0:id.hashCode();
result=prime*result+((object==null)?0:object.hashCode();
result=prime*result+((text==null)?0:text.hashCode();
result=prime*result+((user==null)?0:user.hashCode();
返回结果;
}
@凌驾
公共布尔等于(对象obj){
if(this==obj)
返回true;
if(obj==null)
返回false;
如果(getClass()!=obj.getClass())
返回false;
DiReview other=(DiReview)obj;
如果(createDate==null){
如果(other.createDate!=null)
返回false;
}如果(!createDate.equals(other.createDate))
返回false;
if(id==null){
if(other.id!=null)
返回false;
}如果(!id.equals(other.id))
返回false;
if(object==null){
if(other.object!=null)
返回false;
}如果(!object.equals(other.object))
返回false;
if(text==null){
如果(other.text!=null)
返回false;
}如果(!text.equals(other.text))
返回false;
if(user==null){
if(other.user!=null)
返回false;
}如果(!user.equals(other.user))
返回false;
返回true;
}
@凌驾
公共字符串toString(){
返回“DiReview[id=“+id+”,user=“+user+”,object=“+object
+“,text=“+text+”,createDate=“+createDate+”]”;
}
}
公共T使持久化(T实体){
试一试{
getSessionFactory().getCurrentSession().persist(实体);
}捕获(例外e){
e、 printStackTrace();
}
返回实体;
}

我不确定这是否解决了您的问题,但在使用序列生成器时,Hibernate默认情况下一次分配50个ID值的块,这可能意味着它无法获取您可能期望的序列值。您可以通过如下更改@SequenceGenerator的注释来更改此设置:

@SequenceGenerator(name = "di_review_seq", sequenceName = "DI_REVIEW_SEQ", 
        allocationSize = 1)

现在还不清楚你到底想达到什么目标。虽然这不是解决我问题的办法,但它对我帮助很大。为了创建数据库模式,我使用OracleHTML向导创建表及其序列。但是这个向导也为增量ID创建了触发器。这些触发器与Hibernatem结合起来并不是很好的组合:-)我的实体ID的计算算法比以前-(sequence的最后一个数字)*(分配大小)。所以这就是ID的一个大数字。解决方案是-删除所有增量触发器!!!非常感谢你
@SequenceGenerator(name = "di_review_seq", sequenceName = "DI_REVIEW_SEQ", 
        allocationSize = 1)