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.
・ JDK1.8 ・ Ruhezustand (5.2.10.FINAL) · SQL Server 2016
sequence_mng
CREATE TABLE sequence_mng (
colname VARCHAR(40) NOT NULL,
nextvalue BIGINT NOT NULL,
PRIMARY KEY colname
);
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.
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.
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();
}
}
Da StringType zum ersten Argument kommt, ersetzen Sie es durch BigDecimalType (), bevor Sie es an die übergeordnete Klasse übergeben (^^).
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.
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.
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
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