Java 默认情况下如何在hibernate中使用自定义密钥生成器

Java 默认情况下如何在hibernate中使用自定义密钥生成器,java,hibernate,jpa,Java,Hibernate,Jpa,我希望能够在hibernate中使用我自己的自定义id生成器,但不必为每个实体添加多个注释 例如: @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "XyzIdGenerator") @GenericGenerator(name = "XyzIdGenerator", strategy = "com.mycompany.myapp.id.BigIntegerSequenceGenerator"

我希望能够在hibernate中使用我自己的自定义id生成器,但不必为每个实体添加多个注释

例如:

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "XyzIdGenerator")
@GenericGenerator(name = "XyzIdGenerator",
        strategy = "com.mycompany.myapp.id.BigIntegerSequenceGenerator",
        parameters = {
            @Parameter(name = "sequence", value = "xyz_id_sequence")
        })
太多了。如果hibernate看到“@Id”,我想把它设置在哪里
默认情况下,它将调用我的生成器并将其分配给id。

我通常这样做的方式是创建一个超类,其中包含共享的带注释的变量,并使实体扩展它。例如:

@MappedSuperclass
public class PersistableEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "XyzIdGenerator")
    @GenericGenerator(name = "XyzIdGenerator",
            strategy = "com.mycompany.myapp.id.BigIntegerSequenceGenerator",
            parameters = {
                    @Parameter(name = "sequence", value = "xyz_id_sequence")
            })
    protected Long id;

    // ...
}

@Entity
public class Abc extends PersistableEntity {}
@MappedSuperclass
在这里很重要:

指定一个类,该类的映射信息应用于 从中继承的实体。映射的超类没有单独的 为其定义的表


我通常这样做的方式是创建一个超类,其中包含共享的带注释的变量,并使实体扩展它。例如:

@MappedSuperclass
public class PersistableEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "XyzIdGenerator")
    @GenericGenerator(name = "XyzIdGenerator",
            strategy = "com.mycompany.myapp.id.BigIntegerSequenceGenerator",
            parameters = {
                    @Parameter(name = "sequence", value = "xyz_id_sequence")
            })
    protected Long id;

    // ...
}

@Entity
public class Abc extends PersistableEntity {}
@MappedSuperclass
在这里很重要:

指定一个类,该类的映射信息应用于 从中继承的实体。映射的超类没有单独的 为其定义的表


另一个问题可能是,由于所有表都使用相同的序列生成器,因此没有数字重叠……这可能很好,但可能会导致其他问题(例如任意大的索引值快速增加)。其他人维护它也可能会更困难,因为它比正常情况下要少。为什么不添加一个IDE宏来转储所有注释,使其快速简便呢?事实上,我没有对ID使用这种“模式”,但对于其他几个字段,如创建/删除日期等。您提到的顺序问题不是不可能解决的,不过,另一个问题可能是,所有表都使用同一个序列生成器,因此没有数字重叠……这可能很好,但可能会导致其他问题(例如任意大的索引值增长非常快)。其他人维护它也可能会更困难,因为它比正常情况下要少。为什么不添加一个IDE宏来转储所有注释,使其快速简便呢?事实上,我没有对ID使用这种“模式”,但对于其他几个字段,如创建/删除日期等。您提到的顺序问题不是不可能解决的,不过。