如何使用我自己的生成密钥的策略实现@GeneratedValue

时间:2014-06-01 08:11:03

标签: java hibernate jpa annotations

我想实现自己的策略来为我的表中的新行生成主键,例如我希望主机的id为172.24.85.20将是8520。

我可以以某种方式扩展@GeneratedValue注释吗?你会推荐哪种方法?

提前10倍!

半乳糖

3 个答案:

答案 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")