我使用hibernate序列生成实体的id。我使用PostgreSQL 9.1。
是否可以在将实体ID保存到数据库之前获取它?怎么样?
答案 0 :(得分:2)
save()方法返回保存的实体的id。你可以用它!
参考: - > http://docs.jboss.org/hibernate/annotations/3.5/api/org/hibernate/Session.html
答案 1 :(得分:2)
您明确地创建一个单独的序列,获取其值,然后插入一个基于该值的id对象。您将拥有更多代码,但ID将在插入之前可用,并且序列的保证与连续给定的ID完全相同,因为它们基本相同。
换句话说:
int
而非serial
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
}