我希望实现自己的策略来为表中的新行生成主键,例如,我希望主机的id为172.24.85.20为8520。
我能以某种方式扩展@GeneratedValue注解吗?你会推荐哪种方法?
提前10倍!
盖尔
发布于 2014-06-01 17:19:56
在我的项目中,我还使用了一个定制键,因为我需要在调用persist()之前就已经具有唯一标识的实体。我的解决方案不是使用@GeneratedValue注释,而是手动初始化id字段。@GeneratedValue注释依赖于您的数据库,主键由它提供。在您的示例中,id字段可以在调用EntityManager.persist()之前计算和设置,或者可以在@PrePersist注释的EntityListener方法(http://www.java2s.com/Tutorial/Java/0355__JPA/EntityListenerPreUpdate.htm)中处理该步骤。除此之外,扩展注解是不可能的(Why is not possible to extend annotations in Java?);您只能通过使用构造型来组合注解,或者创建自己的注解。
发布于 2014-06-03 15:50:28
您应该选中此链接:
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;
发布于 2017-12-08 20:31:41
你可以试试这个有日期和日历的
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")
https://stackoverflow.com/questions/23977909
复制相似问题