2017-10-19 23 views
0

Je souhaite insérer (pas mettre à jour) les données dans mon référentiel avec des ID spécifiques, mais chaque fois que je le fais, les ID sont ignorés et les entrées insérées ont simplement l'ID suivant dans la séquence.spring crudrepository enregistrer avec ID spécifique

Entity entity = new Entity(); 
entity.setId(4l); 
//.. 
Entity saved = repository.save(entity); 
System.out.println(saved.getId()); // is 1l 

Voilà comment ma configuration ressemble

@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> { 

} 

J'ai aussi essayé de changer la stratégie de génération en AUTO mais je reçois

Table 'embedded-db.hibernate_sequence' doesn't exist

Comment puis-je insérer des données avec ID spécifique tout en permettant également la création de l'ID?

UPDATE

Ok, alors je découvert que l'une des solutions oblige à utiliser une séquence spécifique pour générer l'ID et en utilisant la stratégie de génération AUTO comme ceci:

@Id 
@Column(name = "ID") 
@GeneratedValue(strategy=GenerationType.AUTO, generator="my_seq_gen") 
@SequenceGenerator(name="my_seq_gen", sequenceName="actual_seq_name") 
private Long id; 

Cependant, je utilisez mariaDb pour mon test env et il ne supporte pas les séquences, donc cette solution ne fonctionne pas pour moi. Y a-t-un autre moyen de faire ça?

Répondre

1

Vous obtenez l'erreur, car AUTO signifie la mise en œuvre JPA:

... choisir une stratégie appropriée pour la base de données particulière.

(Source)

qui, pour la base de données que vous utilisez (pas sûr que l'on?), Signifie mise en veille prolongée regarde dans un tableau prédéfini pour la prochaine valeur d'ID à utiliser.

Lorsque vous définissez les ID manuellement, supprimez l'annotation @GeneratedValue de votre variable.

+0

Cela fonctionne quand je l'insère avec ID, mais j'en ai besoin aussi pour générer des identifiants quand ils ne sont pas fournis. En ce qui concerne la base de données, je ne peux vraiment pas dire que pour tester en local j'utilise MariaDb, et en production c'est sur le cloud amazon qui fonctionne sur qui sait quoi. – Benedictus

+0

@Benedictus alors c'est un problème subtilement différent (et pas quelque chose que vous avez mentionné dans votre question originale!). Comme la réponse de fartpig l'indique, une solution pragmatique serait d'avoir une classe 'AbstractEntity', puis d'avoir deux classes enfants avec un comportement d'allocation d'identifiant différent. (J'espère que vous avez une bonne stratégie pour éviter les collisions !!!) – Catchwa

1

Je pense que vous pouvez utiliser les classes parent et enfant pour supporter cette fonction. Vous avez défini une classe abstraite avec la classe de membre no id, et avez la classe de deux enfants JPA, ceux qui correspondent à la même table, mais la stratégie d'identification est différente. Donc, dans votre code, quand vous voulez définir l'identifiant, vous pouvez utiliser le code no @ GeneratedValue. Et l'autre avec @GeneratedValue peut prendre en charge le cas d'incrémentation automatique.