Java 如何使用我自己的密钥生成策略实现@GeneratedValue
我希望实现自己的策略,为表中的新行生成主键,例如,我希望主机的id为172.24.85.20,为8520 我可以扩展@GeneratedValue注释吗?你会推荐哪种方法 提前10倍Java 如何使用我自己的密钥生成策略实现@GeneratedValue,java,hibernate,jpa,annotations,Java,Hibernate,Jpa,Annotations,我希望实现自己的策略,为表中的新行生成主键,例如,我希望主机的id为172.24.85.20,为8520 我可以扩展@GeneratedValue注释吗?你会推荐哪种方法 提前10倍 Gal在我的项目中,我也在使用自定义键,因为在调用persist之前,我需要具有唯一标识的实体。我的解决方案不是使用@GeneratedValue注释,而是手动初始化id字段。@GeneratedValue注释取决于您的数据库,主键由它提供。 在您的情况下,可以在调用EntityManager.persist之前计
Gal在我的项目中,我也在使用自定义键,因为在调用persist之前,我需要具有唯一标识的实体。我的解决方案不是使用@GeneratedValue注释,而是手动初始化id字段。@GeneratedValue注释取决于您的数据库,主键由它提供。 在您的情况下,可以在调用EntityManager.persist之前计算并设置id字段,或者可以在@PrePersist注释的EntityListener方法中处理该步骤。
除此之外,扩展注释是不可能的;您只能使用原型组合注释或创建自己的注释。您应该检查此链接: 您必须创建一个实现IdentifierGenerator的类:
public class StockCodeGenerator implements IdentifierGenerator {
private static Logger log = Logger.getLogger(StockCodeGenerator.class);
public Serializable generate(SessionImplementor session, Object object)
throws HibernateException {
// Here goes the id generation code
}
}
然后在@GenericGenerator注释中使用它:
@Id
@GenericGenerator(name="seq_id", strategy="my.package.StockCodeGenerator")
@GeneratedValue(generator="seq_id")
String myColumn;
@Id
@GenericGenerator(name="seq_id",strategy="com.mvc.StockCodeGenerator.
StockCodeGenerator")
@GeneratedValue(generator="seq_id")
你可以试试这件有日期和日历的
public class StockCodeGenerator implements IdentifierGenerator {
private static Logger log = Logger.getLogger(StockCodeGenerator.class);
public StockCodeGenerator() {}
public int generateCustId() {
Random random = new Random();
return random.nextInt(100);
}
public Serializable generate(SessionImplementor session, Object object)
throws HibernateException {
String prefix = "Custom_String";
Connection connection = session.connection();
System.out.println(session.connection());
Date date = new Date();
Calendar calendar = Calendar.getInstance();
return prefix + "_" + generateCustId() + "_" + calendar.get(1);
}
}
然后在@GenericGenerator注释中使用它:
@Id
@GenericGenerator(name="seq_id", strategy="my.package.StockCodeGenerator")
@GeneratedValue(generator="seq_id")
String myColumn;
@Id
@GenericGenerator(name="seq_id",strategy="com.mvc.StockCodeGenerator.
StockCodeGenerator")
@GeneratedValue(generator="seq_id")
好的,所以注释是不可能的。由于我正在使用第三方frameworklight admin向表中添加和删除对象,因此我希望使用另一个选项,使用我自己的策略为这些对象生成键。