Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用我自己的密钥生成策略实现@GeneratedValue_Java_Hibernate_Jpa_Annotations - Fatal编程技术网

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

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之前计

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

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

提前10倍


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向表中添加和删除对象,因此我希望使用另一个选项,使用我自己的策略为这些对象生成键。