繁体   English   中英

春季cruderepository保存具有特定ID

[英]spring crudrepository save with specific id

我想将具有特定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 ,它不支持序列,因此该解决方案不适用于我。 还有其他方法吗?

您收到错误消息是因为AUTO意味着JPA实现将:

...为特定的数据库选择适当的策略。

来源

对于您正在使用的数据库(不确定哪个?),这意味着休眠将在预定义的表中查找要使用的下一个ID值。

手动设置ID时,请从变量中删除@GeneratedValue批注。

我认为您可以使用父类和子类来支持此功能。 您使用no id成员类定义了一个抽象类,并具有两个JPA子类,它们映射到同一张表,但是id策略是不同的。 因此,在代码中,当您要设置id时,可以使用no @GeneratedValue。 另一个带有@GeneratedValue的变量可以支持自动递增的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM