Ich habe eine Tabelle mit einer generierten ID, aber in einigen Fällen möchte ich es selbst einstellen. Kann ich Hibernate zwingen, den @GeneratedValue zu ignorieren?@Id @GeneratedValue aber eigenen ID-Wert setzen
Antwort
Es hat eine übertrieben sein, aber haben Sie sich Gedanken über Ihre eigene CustomIDGenerator schreiben, die wahrscheinlich Subklassen der Autogenerator von Hibernate sagen und macht ein paar Methoden, wo Sie die ID des nächsten Klassenobjekt festlegen können
erzeugt, so zum Beispiel zuclass MyGenerator extends .... {
public void setIdForObject(Class clazz, Long id) {
//once you use this API, the next time an object of
//type clazz is saved the id is used
}
public void setIdForObject(Class clazz, Long id, Matcher matcher) {
//once you use this API, the next time an object of
//type clazz is saved and the matcher matches yes the id will be
//assigned. Your matcher can match properties like name, age etc
//to say the matched object
}
}
Dies kompliziert könnte aber zumindest ist möglich, da pro hibernate doco
In den hibernate.org Foren gibt es einen Benutzer, der seine Generator-Klasse für dieses genaue Szenario geschrieben hat: https://forum.hibernate.org/viewtopic.php?p=2404032 – tmarthal
Ich stolperte auf diese Anfrage auf der Suche nach einer Lösung für die exakt gleiche Frage (obwohl ich EclipseLink anstelle von Hibernate verwende). Ich begann mit einem benutzerdefinierten ID-Generator, aber (zumindest in meinem EclipseLink-Szenario) gibt es ein Problem: Woher weiß ich, ob das Objekt, das persistent sein muss, bereits eine ID hat oder nicht? Ich habe nicht das Entitätsobjekt in meinem benutzerdefinierten ID-Generator zur Hand. Ich kann also nicht feststellen, ob ich eine neue ID generieren muss - falls das Objekt keine hat. Oder wenn ich nur die ID zurückgebe, die das Objekt bereits hat (oder vielleicht Null oder was auch immer notwendig ist). – Jens
Add-on zu meinem Kommentar vor: In EclipseLink gibt es beim Erstellen eines eigenen Sequence-Generators eine Methode namens 'shallAlwaysOverrideExistingValue', die überschrieben werden kann. Dies scheint eine mögliche Lösung zu sein. Obwohl es sich ein wenig unangenehm anfühlt, Dinge zu überschreiben, die ich nicht vollständig überblicke und auch keine Dokumentation zu diesem [Bug] gefunden habe (https://bugs.eclipse.org/bugs/show_bug.cgi?id=300556) Eintrag. – Jens
Für Ihren Anwendungsfall können Sie diesen Benutzer manuell hinzufügen. Eine Möglichkeit besteht darin, die Einfügeoperation in eine Datei mit dem Namen "./import.sql" (in Ihrem Klassenpfad) zu versetzen. Hibernate wird diese Anweisungen ausführen, wenn die SessionFactory gestartet wird.
@Emmanuel Bernard Er sagte: ** aber in einigen Fällen ** würde ich es gerne selbst einstellen. Wenn Sie definieren, wie Hibernate eine Entity speichern soll (über die Datei "/.import.sql"), funktioniert die automatische Generierung des Bezeichners nicht, oder? –
Nein, es ist nicht verwandt, import.sql ist einfach SQL, so können Sie tun, was Sie wollen, einschließlich der Aktualisierung der Sequenz oder Tabelle ID, wenn nötig –
Gut zu wissen (+1) Ich werde es versuchen. –
Obwohl diese Frage vor einer ganzen Weile gefragt wurde, fand ich die perfekte Antwort für sie in this post von @lOranger und wollte teilen es.
Dieser Vorschlag prüft, ob die aktuelle ID des Objekts auf etwas anderes als null
gesetzt ist, und wenn dies der Fall ist, wird sie verwendet, andernfalls wird sie mit der Standardgenerierungsstrategie (oder der konfigurierten) generiert.
Es ist einfach, direkt, und adressiert das Problem, das von @Jens heraufbeschworen wird, von einem, der die aktuelle ID des Objekts nicht abrufen kann.
Ich setzte es nur (durch die UUIDGenerator erstreckt), und es wirkt wie ein Zauber :-D
Ihre eigene identifiergenerator/sequencegenerator
public class FilterIdentifierGenerator extends IdentityGenerator implements IdentifierGenerator{
@Override
public Serializable generate(SessionImplementor session, Object object)
throws HibernateException {
// TODO Auto-generated method stub
Serializable id = session.getEntityPersister(null, object)
.getClassMetadata().getIdentifier(object, session);
return id != null ? id : super.generate(session, object);
}
}
ändern Ihr Unternehmen als erstellen:
@Id
@GeneratedValue(generator="myGenerator")
@GenericGenerator(name="myGenerator", strategy="package.FilterIdentifierGenerator")
@Column(unique=true, nullable=false)
private int id;
...
und beim Speichern anstelle von persist()
merge()
oder update()
- 1. Wie setzen Long ID neu java.util.Date(). GetTime() zu @GeneratedValue
- 2. Bypass GeneratedValue im Ruhezustand
- 3. Eigenen Cursor aus Ressourcendatei setzen
- 4. JPA: Verwendung von @GeneratedValue in Nicht-ID-Spalte
- 5. Setzen Sie HtmlFieldPrefix für die ID, aber nicht den Namen
- 6. Hibernate-Sequenz auf Oracle, @GeneratedValue (Strategie = GenerationType.AUTO)
- 7. SqlServer zu mySql5.5 konvertieren, JPA @GeneratedValue nicht
- 8. Neue ID mit jQuery setzen
- 9. Java, ID für JButton setzen
- 10. ServiceNotFoundException aber ID existiert
- 11. Wie wird der Anfangswert für @Id @GeneratedValue in Spring JPA für MySQL festgelegt?
- 12. Hibernate: Überblick über die Funktionsweise von @GeneratedValue
- 13. Cant setzen ID von Variable div Jade
- 14. Ist es möglich, eine @GeneratedValue-Feldannotation zu entfernen, die auf eine @Id-Spalte in @MappedSuperclass in einer Unterklasse angewendet wurde?
- 15. Setzen Sie sich mit ID passenden
- 16. mysql - Spaltenwert gleich einfügen ID setzen?
- 17. ID-Attribut mit Googles Map API setzen
- 18. Touch ID bei Erfolg eine Variable setzen
- 19. Wo setzen Sie die Task-ID einer Sellerie-Aufgabe?
- 20. ID erhalten und in Werte setzen
- 21. Die ID eines Labels in Zend_Form setzen
- 22. Ziel c Klassen warum zurückgeben - (id) statt seiner eigenen Klasse
- 23. @GeneratedValue mit Strategie = GenerationType.AUTO generiert Wert wiederholt nach dem Neustart
- 24. Spring @GeneratedValue Annotationen funktionieren nicht für Auto Inkrement Feld
- 25. Frühling 4.3.0.RELEASE + Hibernate 5.2.0.Final - GeneratedValue auf mysql
- 26. Bestimmung id-Attribut des eigenen Flash-Elements aus dem Flash
- 27. Git Push schlägt aber richtig CHMOD setzen
- 28. Eine Szene, aber mehrere Ansichtsfenster mit ihrer eigenen Kamera (three.js)
- 29. Slim-Endpunkt funktioniert mit php eigenen Server, aber nicht nginx
- 30. Eigenen Design-Einstellungen Bildschirm
Haben Sie es versucht, sehen was passiert? – skaffman
Ja, Hibernate ist es egal, ob die ID gesetzt ist oder nicht - es wird trotzdem ein Wert generiert. – woezelmann
Ich wusste, dass ich das schon mal irgendwo gesehen habe: http://StackOverflow.com/Questions/89439/Bypass-generatedvalue-in-Hibernate - benutz 'merge()' anstatt 'persist()' – skaffman