Nun, ich denke nicht, dass das funktionieren würde. JPA generiert automatisch Ihren ID-Wert und ist verantwortlich für die @GeneratedValue
. Fragen Sie sich, was passiert, wenn bereits eine Entität mit der ID 100 vorhanden ist. Und ich erstelle manuell eine neue Entität mit der ID 100 '. Intuitiv würde ich sagen, dass JPA (oder die Implementierung) eine Überraschung weckt.
Während die obige Antwort zu schreiben hatte ich die Idee des eigenen Generator schriftlich (nicht überhaupt versucht, gerade hier bei Stackoverflow codiert unten.
Sie können Ihre eigene Implementierung eines Generators an die @GeneratedValue
Anmerkung passieren
@Id
@GeneratedValue(startegy = GenerationType.IDENTITY, generator="generatedIdOrCustomId")
@GenericGenerator(name="generatedIdOrCustomId", strategy="GeneratedIdOrCustomId")
private Long id;
...
Und die benutzerdefinierte Implementierung sollte wie folgt aussehen:
public class GeneratedIdOrCustomId extends IdentityGenerator {
@Override
public Serializable generate(SessionImplementor session, Object obj) throws HibernateException {
if (((YourEntity) obj).getId() == null) {
// the id is null, let JPA create an id.
return super.generate(session, obj);
} else {
// the id is set and should not be generated by JPA.
return ((YourEntity) obj).getId();
}
}
die m erzeugen Ethod ist nur eine schnelle und schmutzige Umsetzung. Sie müssen zum Beispiel auch prüfen, ob die obj == null
und in diesem Fall eine (Hibernate)Exception
werfen.
Bitte erläutern Sie, wie ein "langes" Feld "nicht gesetzt" werden kann? Wenn es ein Long wäre, könnte ich vielleicht verstehen, aber nicht lange. –