JPA/Oracle - Sequenz bei zusammen gesetztem Schlüssel


#1

Ich habe einen Tabelle Gruppe:

GruppenId|Variante|Bezeichnung   |...
---------|--------|--------------|---
1        |0       |Text irgendwas|...
---------|--------|--------------|---
2        |0       |bla           |...
---------|--------|--------------|---
...      |...     |...           |...

Die Klasse dazu sieht etwa so aus:

@Table(name = "Gruppe")
public class Gruppe{

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "grid")
    @SequenceGenerator(name="grid", sequenceName = "GruppenID_SEQ", allocationSize=1)
    @Basic(optional = false)
    @Column(name = "GruppenId")
    private Long gruppenId;
    
    @Basic(optional = false)
    @Column(name = "Variante")
    private long variante;

    @Basic(optional = false)
    @Colum(name = "Bezeichnung")
    private String bezeichnung;
   
    ...
    // Getter und Setter
}```

Die GruppenId war bisher der Primary-Key und besitzt eine Sequenz zur Id-Vergabe und Die Variante wurde immer auf 0 gesetzt. Jetzt wird aber die Variante noch Bestandteil des Schlüssels. Die Sequenz soll weiterhin nur für die GruppenId gelten. Möchte ich aber eine neue Variante einer bestehenden Gruppe speichern ich würde ich die Variante entsprechend hochzählen. Das ganze sähe in der Tabelle dann so aus:

GruppenId Variante Bezeichnung
1 0 Text irgendwas
--------- -------- --------------
2 0 bla
--------- -------- --------------
1 1 neue Variante
--------- -------- --------------


Ist das mit zusammen gesetzten Schlüsseln mit Hibernate möglich?

Meine Idee wäre jetzt, einfach bei der Variante noch die Annotation @Id mit dran zusetzen.
```@Entity
@Table(name = "Gruppe")
public class Gruppe{

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "grid")
    @SequenceGenerator(name="grid", sequenceName = "GruppenID_SEQ", allocationSize=1)
    @Basic(optional = false)
    @Column(name = "GruppenId")
    private Long gruppenId;
    
    @Id
    @Basic(optional = false)
    @Column(name = "Variante")
    private long variante;

    @Basic(optional = false)
    @Colum(name = "Bezeichnung")
    private String bezeichnung;
   
    ...
    // Getter und Setter
}```

#2

Deine Anforderung klingt eher nach einer Natural ID. Die automatisch generieren zu lassen hört sich für mich eher ungewöhnlich an.
Ich habe die entsprechende Dokumentation für die ID-Generierung mal kurz überflogen, benutzerdefinierte Strategien aber nicht ausfindig gemacht:
http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch05.html#mapping-declaration-id

Zusammengesetzte Primärschlüssel kannst du entweder per @IdClass oder per @EmbeddedId erzeugen. Siehe dazu auch hier:
http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Composite_Primary_Keys


#3

Das könnte noch interessant sein:
https://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html#d0e1150


#4

huch, hatte die Frage vergessen.

Ich habe es jetzt so gelöst, das ich eine PK-Klasse erstellt habe und diese dann als EmbeddedId nutze. Leider klappt es nun nicht mehr mit der Sequenz und ich muss mir den Wert der Sequenz beim Speichern selber holen.

Liegt viellecht auch daran, dass ich eine etwas ältere HibernateVersion nutze. Meine Klassen sehen jetz so aus:

public class GruppePK{
 
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "grid")
    @SequenceGenerator(name="grid", sequenceName = "GruppenID_SEQ", allocationSize=1)
    @Basic(optional = false)
    @Column(name = "GruppenId")
    private Long gruppenId;
   
    @Basic(optional = false)
    @Column(name = "Variante")
    private long variante;

//Konstruktoren + Getter + Setter
@Table(name = "Gruppe")
public class Gruppe{
 
    @EmbeddedId
    protected GruppePK gruppePk;
 
    @Basic(optional = false)
    @Colum(name = "Bezeichnung")
    private String bezeichnung;

    public Gruppe(){
        this.gruppePk = new GruppePK();
    }
//Getter + Setter```