我想拥有一个具有AUTO IdGeneration策略的实体,我需要它在Oracle和MySQL上工作,我需要在Oracle的情况下为每个权利指定序列名称。
当我将主键注释为:
@Id
@Column(name="id")
@GeneratedValue(strategy= GenerationType.AUTO, generator="sequence")
我在MySQL上遇到错误,序列生成器未知。
如果我使用
@Id
@Column(name="id")
@GeneratedValue(strategy= GenerationType.AUTO)
我无法为每个表指定序列名称。 这是解决这个问题的方法吗?
我使用Hibernate作为我的JPA提供程序
答案 0 :(得分:0)
您将id字段声明为:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY,
generator = "LegacyIdGenerator")
@GenericGenerator(
name = "LegacyIdGenerator",
strategy = "com.backend.hibernate.PenetratingIdGenerator")
其中PenetratingIdGenerator是您的自定义ID生成器实现的IdentifierGenerator接口。现在,您可以根据需要生成ID,而不依赖于底层数据库。 在任何情况下,您的应用程序都会知道db是底层的,因为您需要在配置文件中定义不同的方言等。
答案 1 :(得分:0)
对于注释@GeneratedValue(strategy = GenerationType.AUTO)
,JPA
持久性提供程序将针对特定数据库采取适当的策略。对于Oracle数据库,这将是SEQUENCE
,如果您不指定任何内容,Hibernate将使用单个全局序列,即hibernate_sequence
。
@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="seq_gen_default")
@SequenceGenerator(name="seq_gen_default", sequenceName="ENTITY_SEQ")
private Long id;