[JAVA] Generieren Sie mit TableGenerator of Hibernate (JPA) eine Seriennummer und speichern Sie diese in der ID von String.

Einführung

Wenn Sie eine Entität im Ruhezustand beibehalten, möchte ich die Annotation @GeneratedValue für das mit Annotationen versehene Feld @Id verwenden und in einer CHAR-Spalte festlegen.

Aufgrund der Spezifikationen der übernommenen Geschäfts-FW gibt es jedoch anstelle von SEQUENCE of DBMS (SQL Server) eine separate Erfassungstabelle für die Sequenzseriennummer (sequence_mng), und sequence_mng wird nicht verwendet, um die Konsistenz beim Erstellen eines neuen Datensatzes aufrechtzuerhalten. Es darf nicht sein.

Die Spalte sollte auch BIGINT sein! Ich denke, aber es kann nicht geholfen werden, weil es so etwas wie "Null-Auffüllung und feste Ziffer" gibt.

Voraussetzungen

Ausführungsumgebung

・ JDK1.8 ・ Ruhezustand (5.2.10.FINAL) · SQL Server 2016

Sequenzverwaltungstabelle

sequence_mng


CREATE TABLE sequence_mng (
	colname VARCHAR(40) NOT NULL,
	nextvalue BIGINT NOT NULL,
	PRIMARY KEY colname
);

Sequenzzuschuss-Zieltabelle

partner


CREATE TABLE m_partner (
	partner_cd CHAR(6) NOT NULL,
	partner_nm NVARCHAR(60) NOT NULL,
        -- OMITTED
        PRIMARY KEY partner_cd
);

So, wenn Sie versuchen, es dauerhaft zu machen, indem Sie save () usw. aufrufen.

Testversion des Tabellengenerators

Und mit diesem Muster habe ich das Gefühl, dass ich "GenerationType.TABLE" verwenden kann. genau wie dieser

Partner.java(Failure)


@Entity
@Table(name = "partner")
public class Partner {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "SEQ_TBL_PARTNER")
    @TableGenerator(name = "SEQ_TBL_PARTNER", 
      table = "sequence_mng",
      pkColumnName = "colname",
      valueColumnName = "nextvalue",
      pkColumnValue = "partner_cd")
    @Column(name = "partner_cd", unique = true, nullable = false, length = 6)
    private Integer partnerCd;

    @Column(name = "partner_nm", nullable = false)
    private String partnerNm;
//Folgendes wird weggelassen
}

Allerdings ist die Substanz von @TableGenerator org.hibernate.id.enhanced.TableGenerator Eigentlich mit'org.hibernate.id.IdentifierGeneratorHelper # getIntegralDataTypeHolder ' Das @ ID-Feld erlaubt nur long (Long), BigDecimal IdentifierGenerationException("Unknown integral data type for ids : StringType()) Es bewegt sich nicht daneben. Wie oben erwähnt, können die Spaltenattribute nicht geändert werden.

Anpassen

Daher werde ich einen StringTableGenerator erstellen, der TableGenerator erbt und zum Funktionieren bringt. StringTableGenerator.java Erstellen Sie einen StringTableGenerator, der von TableGenerator erbt.

StringTableGenerator.java


package sample.hibernate.id;

import org.hibernate.MappingException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.IdentifierGeneratorHelper;
import org.hibernate.id.IntegralDataTypeHolder;
import org.hibernate.id.enhanced.TableGenerator;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.type.BigDecimalType;
import org.hibernate.type.Type;

import java.io.Serializable;
import java.util.Properties;

/**
 * TableGenerator (Unterstützung für Zeichenkettenspalten)
 */
public class StringTableGenerator extends TableGenerator {

  @Override
  public void configure(Type type, Properties params, ServiceRegistry serviceRegistry)
    throws MappingException {
    super.configure(new BigDecimalType() , params, serviceRegistry);
  }

  @Override
  public Serializable generate(SharedSessionContractImplementor session, Object obj) {
    return super.generate(session, obj).toString();
  }

}

configure () -Methode

Da StringType zum ersten Argument kommt, ersetzen Sie es durch BigDecimalType (), bevor Sie es an die übergeordnete Klasse übergeben (^^).

generate () -Methode

Der von der übergeordneten Klasse zurückgegebene Wert ist BigDecimal. Ersetzen Sie ihn daher durch einen String, bevor Sie ihn zurückgeben. das ist alles.

Anmerkungseinstellungen

Schreiben Sie dann die Entität, die die Sequenz tatsächlich generiert, wie folgt um.

Partner.java


@Entity
@Table(name = "partner")
public class Partner implements Serializable {
  @Id
  @GeneratedValue(strategy = GenerationType.TABLE, generator = "CUSTOM_SEQ")
  @GenericGenerator(strategy = "sample.hibernate.id.StringTableGenerator", 
    name = "CUSTOM_SEQ", parameters = {
    @Parameter(name = "segment_value", value = "partner_cd"),
    @Parameter(name = "table_name", value = "sequence_mng"),
    @Parameter(name = "segment_column_name", value = "colname"),
    @Parameter(name = "value_column_name", value = "nextvalue")
  })
  @Column(name = "partner_cd", unique = true, nullable = false, length = 6)
  private String partnerCd;

  @Column(name = "partner_nm", nullable = false)
  private String partnerNm;
 
(Folgendes wird weggelassen)

Wechseln Sie von @TableGenerator mit einer festen Klasse zu @GenericGenerator und geben Sie an, dass der zuvor erstellte StringTableGenerator verwendet werden soll. Beachten Sie, dass die Parameter auch ihre Namen ändern.

Mit den obigen Änderungen werden Seriennummern generiert und auch im Feld String festgelegt.

Schließlich

Klicken Sie hier für Sequence Generator (fast Originalmaterial) https://stackoverflow.com/questions/12517421/how-to-map-a-string-to-db-sequence-in-hibernate

Leicht verständliche Beschreibung des Tabellengenerators http://d.hatena.ne.jp/taedium/20070627/p1

Dies ist auch ein leicht verständlicher Tabellengenerator http://qiita.com/KevinFQ/items/a6d92ec7b32911e50ffe

Beiseite

Der Ruhezustand ändert von Zeit zu Zeit die Paketstruktur und den Klassennamen Die Materialien da draußen werden schnell veraltet.

Wenn Sie denken, dass es seltsam ist - es bewegt sich nicht, ist es schneller, die Quelle zu betrachten. Diesmal hat das Attribut @Parameter name funktioniert.

Ich konnte keine andere Unterstützung für TableGenerator und StringType finden, daher gebe ich sie in der Hoffnung ein, dass sie für jemanden nützlich sein wird. dann.

Recommended Posts

Generieren Sie mit TableGenerator of Hibernate (JPA) eine Seriennummer und speichern Sie diese in der ID von String.
Finden Sie mit Kotlin die Anzahl der Tage in einem Monat
zusammengesetzter Schlüssel für den Ruhezustand
Bis zur Verwendung von Spring Data und JPA Part 2
Bis zur Verwendung von Spring Data und JPA Part 1
Generieren Sie mit TableGenerator of Hibernate (JPA) eine Seriennummer und speichern Sie diese in der ID von String.
Fassen Sie die wichtigsten Punkte für den Einstieg in JPA zusammen, die Sie mit Hibernate gelernt haben
Besiege den Aufwand, C-Arrays von Swift als Tupel zu behandeln
So erhalten Sie die ID des automatisch inkrementierten PRIMAY-Schlüssels in MyBatis
Stellen Sie die Sensorinformationen von Raspberry Pi in Java grafisch dar und überprüfen Sie sie mit einem Webbrowser
So erhalten Sie die ID eines Benutzers, der sich in Swift bei Firebase authentifiziert hat
Das n-te und n + 1-Zeichen einer Ruby-Zeichenfolge
[Swift] Wenn Sie wissen möchten, ob die Anzahl der Zeichen in String mit einer bestimmten Anzahl übereinstimmt ...
[Rails] Erhalten Sie access_token zum Zeitpunkt der Twitter-Authentifizierung mit Sorcery und speichern Sie es in der Datenbank
[Spring Data JPA] Die benutzerdefinierte ID wird zum Zeitpunkt der Registrierung in einer eindeutigen Reihenfolge zugewiesen.
Fassen Sie die wichtigsten Punkte für den Einstieg in JPA zusammen, die Sie mit Hibernate gelernt haben
[Java] Geben Sie das Ergebnis von ffprobe -show_streams in JSON aus und ordnen Sie es einem Objekt in Jackson zu
[Swift] Vielmehr ist es sinnvoll, var zu vermeiden und nur dann mit let zu deklarieren, wenn die Zuweisung des Anfangswertes einen Zweig enthält.
Erhöhen Sie dynamisch die Anzahl der Elemente in einem zweidimensionalen Java-Array (mehrdimensionales Array).
Stellen Sie die Anzahl der Sekunden für den schnellen Vor- und Rücklauf in ExoPlayer ein
Verwenden Sie Docker-Compose, um Ihre Lieblings-IP im Host-Netzwerk anzugeben und zu starten.
Ich habe eine Lambda-Funktion in Java geschrieben und mit SAM bereitgestellt
Die Identität der Schienenparameter [: id]
Extrahieren Sie einen Teil einer Zeichenfolge in Ruby
Teilen Sie eine Zeichenfolge in Java mit ". (Dot)"
Ich habe die Daten der Reise (Tagebuchanwendung) in Java erhalten und versucht, sie # 001 zu visualisieren
Holen Sie sich Youtube-Videoinformationen mit Retrofit und behalten Sie sie in der Android-App.
Erstellen Sie einen benutzerdefinierten Formatierer für Yellowfin und zeigen Sie das Minus des numerischen Werts mit △ (Dreieck) an.
Überprüfen Sie das ID-Token eines von AWS Cognito in Java authentifizierten Benutzers
[Java] Wenn Sie eine Zeichenfolge in die switch-Anweisung einfügen, müssen Sie sie zu einem konstanten Ausdruck machen
Ich möchte die MD5-Prüfsumme einer Datei in Java finden und das Ergebnis als Zeichenfolge in hexadezimaler Notation erhalten.