保存到数据库之前获取ID

时间:2013-12-20 11:45:54

标签: java hibernate postgresql sequence

我使用hibernate序列生成实体的id。我使用PostgreSQL 9.1。

是否可以在将实体ID保存到数据库之前获取它?怎么样?

3 个答案:

答案 0 :(得分:2)

save()方法返回保存的实体的id。你可以用它!

参考: - > http://docs.jboss.org/hibernate/annotations/3.5/api/org/hibernate/Session.html

答案 1 :(得分:2)

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

换句话说:

  • 创建自己的序列
  • 使主键变为简单int而非serial
  • 从序列中获取一个数字
  • 将其用作对象的ID

This question有一个答案说明如何获得下一个序列值。

答案 2 :(得分: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

}