2017-10-19 200 views
0

我想插入(不更新)数据到我的存储库与特定的ID,但每当我这样做的ID被忽略,插入的条目只是序列中的下一个ID。春季crudrepository保存与特定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的?

UPDATE

好了,我发现的解决方案之一是迫使使用特定的序列生成的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作为我的测试环境,并且它不支持序列,所以这个解决方案对我不起作用。有没有其他方法可以做到这一点?

回答

1

你得到的错误,因为AUTO意味着JPA的实施将:

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

Source

其中,数据库你使用(不知道是哪一个?),是指休眠看起来在预先定义的表下一个ID值来使用。

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

+0

它在我用ID插入时起作用,但当它们没有提供时,我也需要它来生成id。至于数据库,我真的不能告诉我在本地测试我使用MariaDb,而在生产中它是在亚马逊云上运行,谁知道什么。 – Benedictus

+0

@Benedictus然后这是一个微妙的不同的问题(而不是你在原来的问题中提到的东西!)。正如Fartpig的回答所述,一个实用的解决方案是拥有一个'AbstractEntity'类,然后有两个具有不同id分配行为的子类。 (我希望你有一个好的策略来避免碰撞!!!) – Catchwa

1

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