2013-12-20 41 views

回答

2

您明确地创建一个单独的序列,得到它的值,然后插入一个基于该值与ID对象。您将拥有更多的代码,但在插入之前该ID将可用,并且序列保证与串行给定的ID完全相同,因为它们本质上是相同的。

换句话说:

  • 创建自己的序列
  • 使主键的简单intserial
  • 得到序列
  • 一些使用它作为一个ID为对象

This question有一个答案说如何得到nex t序列值。

0

您可以实现接口org.hibernate.id.IdentifierGenerator并创建一个Id生成器

例子:

import com.fasterxml.uuid.Generators; 
import com.fasterxml.uuid.impl.TimeBasedGenerator; 

public class TimeBasedIDGenerator implements IdentifierGenerator { 

    private static TimeBasedGenerator generator = Generators.timeBasedGenerator(); 

    private static TimeBasedIDGenerator SINGLETON = new TimeBasedIDGenerator(); 

    public static UUID generate() { 
     return SINGLETON.generateUUID(); 
    } 

    @Override 
    public Serializable generate(SessionImplementor session, Object parent) throws HibernateException { 
     return generator.generate();; 
    } 
} 

你可以在你的实体这样使用。所以ID是由构造函数生成的:

@Entity 
public EntityClassName { 

    private UUID uuid; 
    private Integer mandatoryField; 

    public EntityClassName() { 
    } 

    public EntityClassName(Integer mandatoryField) { 
     this.uuid = TimeBasedIDGenerator.generate(); 
     this.mandatoryField = mandatoryField; 
    } 


    @Id 
    @Column(name = COLUMN_XXX_UUID) 
    @Type(type = "java.util.UUID") 
    public UUID getUuid() { 
     return uuid; 
    } 

    // setter + other properties 

} 
+0

由于hibernate通过反射调用默认构造函数,因此此实现将为您的实体在从数据库读取数据时提供一个新ID。看起来你不知道你错过了hibernate的IdentifierGenerator。 – lost

+0

事实上,生成新ID的调用不能在默认构造函数中,而应在其他构造函数中。我会修改我的帖子。 –

相关问题