Wat zijn de mogelijke waarden van de Hibernate hbm2ddl.auto-configuratie en wat doen ze

Ik wil echt meer weten over de update, export en de waarden die kunnen worden gegeven aan hibernate.hbm2ddl.auto
Ik moet weten wanneer ik de update moet gebruiken en wanneer niet? En wat is het alternatief?

Dit zijn wijzigingen die via DB kunnen plaatsvinden:

  • nieuwe tabellen
  • nieuwe kolommen in oude tabellen
  • kolommen verwijderd
  • gegevenstype van een kolom gewijzigd
  • een type van een kolom heeft zijn kenmerken gewijzigd
  • tafels geschrapt
  • waarden van een kolom gewijzigd

Wat is in elk geval de beste oplossing?


Antwoord 1, autoriteit 100%

Van de community-documentatie:

hibernate.hbm2ddl.auto Valideert of exporteert automatisch schema-DDL naar de database wanneer de SessionFactory wordt gemaakt. Met create-drop wordt het databaseschema verwijderd wanneer de SessionFactory expliciet wordt gesloten.

bijv. valideren | bijwerken | creëren | create-drop

Dus de lijst met mogelijke opties is,

  • valideren: valideer het schema, breng geen wijzigingen aan in de database.
  • update: werk het schema bij.
  • creëren: maakt het schema aan en vernietigt eerdere gegevens.
  • create-drop: laat het schema vallen wanneer de SessionFactory expliciet wordt gesloten, meestal wanneer de toepassing wordt gestopt.
  • none: doet niets met het schema, brengt geen wijzigingen aan in de database

Deze opties lijken bedoeld als ontwikkelaarstools en niet om databases op productieniveau te vergemakkelijken. Misschien wilt u de volgende vraag eens bekijken; Sluimerstand: hbm2ddl.auto=update in productie?


Antwoord 2, autoriteit 17%

Er is ook de ongedocumenteerde waarde van “none” om het volledig uit te schakelen.


Antwoord 3, autoriteit 14%

De configuratie-eigenschap heet hibernate.hbm2ddl.auto

In onze ontwikkelomgeving hebben we hibernate.hbm2ddl.auto=create-dropingesteld om te laten vallen en elke keer dat we implementeren een schone database te maken, zodat onze database in een bekende staat verkeert.

>

In theorie kun je hibernate.hbm2ddl.auto=updateinstellen om je database bij te werken met wijzigingen in je model, maar dat zou ik niet vertrouwen op een productiedatabase. Een eerdere versie van de documentatie zei dat dit in ieder geval experimenteel was; Ik weet de huidige status niet.

Voor onze productiedatabase stelt u daarom hibernate.hbm2ddl.autoniet in – de standaardinstelling is om geen databasewijzigingen aan te brengen. In plaats daarvan maken we handmatig een SQL DDL-updatescript dat wijzigingen van de ene versie op de andere toepast.


Antwoord 4, autoriteit 7%

Ten eerste zijn de mogelijke waarden voor de configuratie-eigenschap hbm2ddlde volgende:

  • NONE– Er wordt geen actie uitgevoerd. Het schema wordt niet gegenereerd.
  • create-only– Het databaseschema wordt gegenereerd.
  • drop– Het databaseschema wordt verwijderd.
  • create– Het databaseschema wordt verwijderd en daarna aangemaakt.
  • create-drop– Het databaseschema wordt verwijderd en daarna gemaakt. Bij het sluiten van de SessionFactorywordt het databaseschema verwijderd.
  • validate– Het databaseschema wordt gevalideerd met behulp van de entiteitstoewijzingen.
  • update– Het databaseschema wordt bijgewerkt door het bestaande databaseschema te vergelijken met de entiteitstoewijzingen.

De hibernate.hbm2ddl.auto="update"is handig, maar minder flexibel als u van plan bent functies toe te voegen of aangepaste scripts uit te voeren.

Dus de meest flexibele aanpakis om Flywayte gebruiken.

Maar zelfs als u Flyway gebruikt, kunt u nog steeds het initiële migratiescript genereren met hbm2ddl.


Antwoord 5, autoriteit 5%

Hoewel het een vrij oud bericht is, maar omdat ik wat onderzoek naar het onderwerp heb gedaan, dacht ik eraan om het te delen.

slaapstand.hbm2ddl.auto

Volgens de documentatie kan het vier geldige waarden hebben:

maak | bijwerken | valideren | create-drop

Hier volgt de verklaring van het gedrag getoond door deze waarde:

  • maak: – maak het schema, de gegevens die eerder aanwezig waren (indien aanwezig) in het schema gaan verloren
  • update:- update het schema met de gegeven waarden.
  • valideren: – valideer het schema. Het brengt geen verandering in de DB.
  • create-drop: – maak het schema door de eerder aanwezige gegevens te vernietigen (indien aanwezig). Het laat ook het databaseschema vallen wanneer de SessionFactory wordt gesloten.

Hier volgen de belangrijke punten die het vermelden waard zijn:

  • In het geval van update, als het schema niet aanwezig is in de DB, wordt het schema gemaakt.
  • In het geval van Valideer , als schema niet in DB bestaat, wordt deze niet gemaakt. In plaats daarvan gooit het een foutmelding: – Table not found:<table name>
  • In geval van -Drop , wordt schema niet gedaald bij het sluiten van de sessie. Het daalt alleen bij het sluiten van de sessionfactory.
  • Indien ik deze eigenschap een waarde van deze accommodatie (zeg), in plaats van boven vier hierboven besproken waarden) of het is gewoon leeg. Het toont het volgende gedrag:

    -IF-schema is niet aanwezig in de DB: – het maakt het schema

    -IF-schema is aanwezig in de DB: – Update het schema.


Antwoord 6, Autoriteit 4%

Ik zou liquibase gebruiken voor het bijwerken van uw DB. De schema-updatefunctie van de hibernate is echt alleen O.K. voor een ontwikkelaar terwijl ze nieuwe functies ontwikkelen. In een productiesituatie moet de DB-upgrade zorgvuldig worden behandeld.


Antwoord 7, Autoriteit 2%

hibernate.hbm2ddl.autovalideert automatisch DDL naar het schema wanneer de sessionfactory is gemaakt.

Standaard voert het geen creatie of wijziging uit op DB. Als de gebruiker een van de onderstaande waarden instelt, wordt het DDL-schema automatisch gewijzigd.

  • Maken – doen met het maken van een schema

    <entry key="hibernate.hbm2ddl.auto" value="create">
    
  • Update – Bestaande schema bijwerken

    <entry key="hibernate.hbm2ddl.auto" value="update">
    
  • Valideren – Valideer bestaand schema

    <entry key="hibernate.hbm2ddl.auto" value="validate">
    
  • create-drop – maak het schema automatisch aan en zet het neer wanneer een sessie begint en eindigt

    <entry key="hibernate.hbm2ddl.auto" value="create-drop">
    

Antwoord 8

Als je geen Strings in je app wilt gebruiken en op zoek bent naar vooraf gedefinieerde constanten, bekijk dan de klasse org.hibernate.cfg.AvailableSettingsin de Hibernate JAR, waar je zoek een constante voor alle mogelijke instellingen. In jouw geval bijvoorbeeld:

/**
 * Auto export/update schema using hbm2ddl tool. Valid values are <tt>update</tt>,
 * <tt>create</tt>, <tt>create-drop</tt> and <tt>validate</tt>.
 */
String HBM2DDL_AUTO = "hibernate.hbm2ddl.auto";

Antwoord 9

  • validate: valideert het schema, er gebeurt geen verandering in de database.
  • update: werkt het schema bij met de huidige uitvoeringsquery.
  • create: maakt elke keer een nieuw schema en vernietigt eerdere gegevens.
  • create-drop: laat het schema vallen wanneer de applicatie wordt gestopt of SessionFactory expliciet wordt gesloten.

Antwoord 10

Ik denk dat je je moet concentreren op de

SchemaExport Class 

deze klasse maakt uw configuratie dynamisch
U kunt dus kiezen welke suite u het beste vindt…

Afrekenen [SchemaExport]


Antwoord 11

validate: het valideert het schema en brengt geen wijzigingen aan in de database.
Stel dat u een nieuwe kolom in het toewijzingsbestand hebt toegevoegd en de invoegbewerking uitvoert, dan wordt een uitzondering gegenereerd “ontbrekende de XYZ-kolom” omdat het bestaande schema anders is dan het object dat u gaat invoegen. Als u de tabel wijzigt door die nieuwe kolom handmatig toe te voegen en vervolgens de bewerking Invoegen uitvoert, worden alle kolommen samen met de nieuwe kolom in de tabel ingevoegd.
Betekent dat het geen wijzigingen aanbrengt/aanpast aan het bestaande schema/de bestaande tabel.

update: het wijzigt de bestaande tabel in de database wanneer u een bewerking uitvoert.
U kunt kolommen toevoegen of verwijderen met deze optie van hbm2ddl.
Maar als u een nieuwe kolom gaat toevoegen die ‘NIET NULL’ is, dan negeert het het toevoegen van die specifieke kolom aan de DB. Omdat de tabel leeg moet zijn als u een ‘NIET NULL’-kolom aan de bestaande tabel wilt toevoegen.


Antwoord 12

Sinds 5.0kun je die waarden nu vinden in een speciale Enum: org.hibernate.boot.SchemaAutoTooling(verbeterd met waarde NONEsinds 5.2).

Of nog beter, sinds 5.1, je kunt ook de org.hibernate.tool.schema.ActionEnumdie JPA 2 en “legacy” Hibernate combineert DDL-acties.

Maar , u kunt een DataSourcePROGRAMMATISCH hierbij nog niet configureren. Het zou leuker zijn om dit te gebruiken in combinatie met org.hibernate.cfg.AvailableSettings#HBM2DDL_AUTO, maar de huidige code Verwacht een StringWaarde (fragment genomen van SessionFactoryBuilderImpl):

this.schemaAutoTooling = SchemaAutoTooling.interpret( (String) configurationSettings.get( AvailableSettings.HBM2DDL_AUTO ) );

… en interne enumWaarden van zowel org.hibernate.boot.SchemaAutoToolingen org.hibernate.tool.schema.Actionworden niet publiekelijk blootgesteld.

Hieronder, een voorbeeldprogrammatisch DataSourceConfiguratie (gebruikt in die van My Spring Boot-applicaties) die een Gambit gebruiken dankzij .name().toLowerCase()Maar IT Werkt alleen met waarden zonder dashboard (niet create-dropbijvoorbeeld):

@Bean(name = ENTITY_MANAGER_NAME)
public LocalContainerEntityManagerFactoryBean internalEntityManagerFactory(
        EntityManagerFactoryBuilder builder,
        @Qualifier(DATA_SOURCE_NAME) DataSource internalDataSource) {
    Map<String, Object> properties = new HashMap<>();
    properties.put(AvailableSettings.HBM2DDL_AUTO, SchemaAutoTooling.CREATE.name().toLowerCase());
    properties.put(AvailableSettings.DIALECT, H2Dialect.class.getName());
    return builder
            .dataSource(internalDataSource)
            .packages(JpaModelsScanEntry.class, Jsr310JpaConverters.class)
            .persistenceUnit(PERSISTENCE_UNIT_NAME)
            .properties(properties)
            .build();
}

Antwoord 13

Aan iedereen die zoekt naar de standaardwaarde…

Het is geschreven in de broncode bij versie 2.0.5 van spring-boot en 1.1.0 bij JpaProperties:

   /**
     * DDL mode. This is actually a shortcut for the "hibernate.hbm2ddl.auto"
     * property. Defaults to "create-drop" when using an embedded database and no
     * schema manager was detected. Otherwise, defaults to "none".
     */
    private String ddlAuto;

Other episodes