2017-10-19 1 views
0

Ich möchte Daten in mein Repository mit spezifischen IDs einfügen (nicht aktualisieren), aber wenn ich das tue, werden diese IDs ignoriert und die eingefügten Einträge haben einfach die nächste ID in der Sequenz.spring crudrepository mit spezifischer ID speichern

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

Hier ist, wie mein Setup wie

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

} 

sieht Ich habe auch versucht, die Erzeugung Strategie AUTO ändern, aber dann bekomme ich

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

Wie kann ich Daten mit spezifischen ID einfügen während auch die IDs generiert werden können?

UPDATE

Ok, so dass ich herausgefunden, dass eine der Lösungen zwingt eine spezifische Sequenz zu verwenden, um die ID zu erzeugen und Erzeugungsstrategie AUTO wie diese unter Verwendung von:

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

Jedoch I Verwenden Sie mariaDb für mein Test env und es unterstützt keine Sequenzen, so dass diese Lösung nicht für mich funktioniert. Gibt es einen anderen Weg, dies zu tun?

Antwort

1

Sie bekommen den Fehler, da AUTO bedeutet die JPA-Implementierung wird:

... eine geeignete Strategie für die jeweilige Datenbank auswählen.

(Source)

, die für die Datenbank verwenden Sie (nicht sicher, welche?), Bedeutet Hibernate für den nächsten ID-Wert zu verwenden, in einer vordefinierten Tabelle aussieht.

Während Sie die IDs manuell festlegen, entfernen Sie die @GeneratedValue Annotation aus Ihrer Variablen.

+0

Es funktioniert, wenn ich es mit ID einfügen, aber ich brauche es auch IDs zu generieren, wenn sie nicht zur Verfügung gestellt werden. Wie für die Datenbank kann ich wirklich nicht sagen, wie für das Testen lokal ich MariaDb verwenden, und in der Produktion ist es auf Amazon Cloud, die auf wer weiß was läuft. – Benedictus

+0

@Benedictus dann ist das ein subtil anderes Problem (und nicht etwas, das du in deiner ursprünglichen Frage erwähnt hast!). Wie fartpigs Antwort sagt, wäre eine pragmatische Lösung, eine "AbstractEntity" -Klasse zu haben, dann zwei untergeordnete Klassen mit unterschiedlichem ID-Zuweisungsverhalten. (Ich hoffe du hast eine gute Strategie um Kollisionen zu vermeiden !!!) – Catchwa

1

Ich denke, Sie können die Eltern und Kind-Klasse verwenden, um diese Funktion zu unterstützen. Sie haben eine abstrakte Klasse mit der no-ID-Mitgliedsklasse definiert und verfügen über die beiden untergeordneten JPA-Klassen. Diese sind der gleichen Tabelle zugeordnet, die ID-Strategie ist jedoch anders. Wenn Sie also in Ihrem Code die ID festlegen möchten, können Sie den no @GeneratedValue-Wert verwenden. Und der andere mit @GeneratedValue kann den automatischen Inkrement-Fall unterstützen.

Verwandte Themen