2016-07-11 23 views
0

Ich wollte Sequenz mit Hibernate-Tool (pojo zu sql) generieren. Und definitiv funktioniert es gut.Erstellen Sequenz-ID im Ruhezustand

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seqid-gen") 
@SequenceGenerator(name = "seqid-gen", sequenceName = "RTDS_ADSINPUT_SEQ") 
@Column(name="id") 
public Long getId() { 
    return id; 
} 

Dieser Code erzeugt unter SQL

create sequence RTDS_ADSINPUT_SEQ; 

Das Problem ist, ich mag

START WITH, INCREMENT BY, NOCACHE 

und die endgültige DDL Skript Eigenschaften angeben wollte etwas, was sein sollte unter

CREATE SEQUENCE RTDS_ADSINPUT_SEQ MINVALUE 1 MAXVALUE 
999999999999999999 INCREMENT BY 1 START WITH 1 NOCACHE; 

Bu t soweit ich Hibernate gesehen habe nur Support-Name, Sequence-Name, allocationSize, initialvalue. Mein Zweifel ist, wenn wir allocationSize verwenden = 1 & initialValue = 1 müssen wir noch "nocache" erwähnen. Wenn ja, haben wir irgendeine Art von Annotation für "nocache"?

Bitte beraten Sie mich, wenn ich diese Eigenschaften als Anmerkung in den Pojo aufnehmen kann.

+0

Du bist besser dran guids für Bezeichner verwenden. Alle diese Probleme verschwinden, als ob durch Magie (ersetzt durch eine völlig andere, aber einfachere, Reihe von Problemen) –

+0

Warum nicht einfach initValue und allocationSize angeben und sehen, was passiert? !! –

+0

Sie überprüfen Beitrag. – Byeon0gam

Antwort

0

Sequenz Verwendung nur Oracle, PostgreSQL, DB2, H2

Ich kenne zwei Fall.

(1)

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private int idx; 

auto_increment, Sequenzobjekt -> Strategie = GenerationType.AUTO

(2) Ihr Fall.

Element Details

public abstract String Name (Erforderlich) Ein einzigartiger Generator Name, kann durch eine oder mehr Klassen referenziert wird der Generator für Primärschlüsselwerte.

public abstract Zeichenfolge sequenzName (Optional) Der Name des Datenbanksequenzobjekts, von dem Primärschlüsselwerte abgerufen werden sollen. Der Standardwert ist ein vom Provider gewählter Wert. Standard: hibernate_sequence

public abstract int initial (Optional) Der Wert, von dem das Sequenzobjekt erzeugt zu starten. Standard: 1

public abstract int allokationSize (Optional) Die Menge, um durch Zuweisen von Sequenznummern aus der Sequenz zu erhöhen.Default: 50

DDL

create sequence RTDS_ADSINPUT_SEQ start with 1 increment by 1; 

Entity

@Entity 
@SequenceGenerator(
name = "seqid-gen", 
sequenceName = "RTDS_ADSINPUT_SEQ" 
initiaValue = 1, allocationSize = 1) 
public class XXX { 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seqid-gen") 
    private long id; 

    //getter, setter 
} 
+0

Danke @ Byeon0gam, ich habe dich genommen Lösung mit ein paar mehr Änderungen für "nocache". Nach dem Erstellen der Tabelle habe ich eine Sequenz mit dem Tag liquibase sql erstellt und diesen Sequenznamen in meiner Entitätsklasse sequenceName verwendet. Jetzt funktioniert alles bis jetzt gut. – Mohan

+0

oh. Alles funktioniert gut! gut ~ – Byeon0gam

0

Wie ich weiß, haben wir solche Annotationseigenschaften nicht. Im Idealfall sollten Sie die Sequenz jedoch mit Ihrer eigenen SQL-Abfrage erstellen und stattdessen die Standardsequenz verwenden, die von Hibernate generiert wird. Wenn die Sequenz in der Datenbank vorhanden ist, wird von Hibernate keine generiert. Sie können auch die Hibernate-Generierung deaktivieren.