我想将数据插入(不更新)到具有特定ID的存储库,但每当我这样做时,Id被忽略,插入的条目只包含序列中的下一个id。
Entity entity = new Entity();
entity.setId(4l);
//..
Entity saved = repository.save(entity);
System.out.println(saved.getId()); // is 1l
以下是我的设置如何
@Entity
@Table(name = "ENTITY")
public class Entity {
@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
//...
}
@Repository
public interface SomeRepository extends CrudRepository<Entity, Long> {
}
我也尝试将生成策略更改为AUTO
,但后来我
Table 'embedded-db.hibernate_sequence' doesn't exist
如何插入具有特定ID的数据,同时还允许生成ID?
更新
好的,所以我发现其中一个解决方案是强制使用特定序列生成id并使用生成策略AUTO
,如下所示:
@Id
@Column(name = "ID")
@GeneratedValue(strategy=GenerationType.AUTO, generator="my_seq_gen")
@SequenceGenerator(name="my_seq_gen", sequenceName="actual_seq_name")
private Long id;
但是我使用mariaDb
作为我的测试环境并且它不支持序列,所以这个解决方案对我不起作用。还有其他办法吗?
答案 0 :(得分:1)
您收到错误,因为AUTO
表示JPA实施将:
...为特定数据库选择合适的策略。
(Source)
对于您正在使用的数据库(不确定哪一个?),这意味着hibernate在预定义的表中查找要使用的下一个ID值。
在手动设置ID时,请从变量中删除@GeneratedValue
注释。
答案 1 :(得分:1)
我认为您可以使用父类和子类来支持此功能。您使用no id成员类定义了一个抽象类,并且具有两个JPA子类,这些类映射到同一个表,但id策略不同。所以在你的代码中,当你想设置id时,你可以使用no @GeneratedValue。而@GeneratedValue的另一个可以支持自动增量情况。