spring crudrepository以特定id保存

时间:2017-10-19 00:03:10

标签: java spring hibernate repository spring-data-jpa

我想将数据插入(不更新)到具有特定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作为我的测试环境并且它不支持序列,所以这个解决方案对我不起作用。还有其他办法吗?

2 个答案:

答案 0 :(得分:1)

您收到错误,因为AUTO表示JPA实施将:

  

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

Source

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

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

答案 1 :(得分:1)

我认为您可以使用父类和子类来支持此功能。您使用no id成员类定义了一个抽象类,并且具有两个JPA子类,这些类映射到同一个表,但id策略不同。所以在你的代码中,当你想设置id时,你可以使用no @GeneratedValue。而@GeneratedValue的另一个可以支持自动增量情况。