我想实现自己的策略来为我的表中的新行生成主键,例如我希望主机的id为172.24.85.20将是8520。
我可以以某种方式扩展@GeneratedValue注释吗?你会推荐哪种方法?
提前10倍!半乳糖
答案 0 :(得分:0)
在我的项目中,我也使用自定义密钥,因为在调用persist()之前我已经需要具有唯一标识的实体。我的解决方案不是使用@GeneratedValue注释,而是手动初始化id-field。 @GeneratedValue注释取决于您的数据库,主键是它的提供者。 在您的情况下,可以在调用EntityManager.persist()之前计算和设置id字段,或者可以在@PrePersist带注释的EntityListener方法(http://www.java2s.com/Tutorial/Java/0355__JPA/EntityListenerPreUpdate.htm)中处理该步骤。 除了扩展注释是不可能的(Why is not possible to extend annotations in Java?);您只能通过使用构造型来组合注释或创建自己的注释。
答案 1 :(得分:0)
您应该查看此链接:
http://blog.anorakgirl.co.uk/2009/01/custom-hibernate-sequence-generator-for-id-field/
您必须创建一个实现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;
答案 2 :(得分:0)
您可以尝试使用日期和日历
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="com.mvc.StockCodeGenerator.
StockCodeGenerator")
@GeneratedValue(generator="seq_id")