2016-11-15 5 views
0

In meiner Entity gibt es ein Feld namens ID, markiert mit der Annotation @Id (die ich manuell gesetzt habe) und weiß, ich wollte wissen, gibt es eine Möglichkeit, eine eindeutige ID (mit @ GeneratedValue), aber ich möchte auch die ID manuell setzen und wenn nicht gesetzt, sollte sie es automatisch generieren.JPA @GeneratedValue und @Id

Beispiel:

@Id 
@GeneratedValue 
private long id; 

Schaffung des Unternehmens

new Entity(someid) //Once with ID and no generated value 
new Entity() //Second without ID and generated unique value 

Ich hoffe, dass Sie mich verstehen können.

+1

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. –

Antwort

2

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.

+0

Okay, es würde ein Problem geben. Vielen Dank. –

Verwandte Themen