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-drop
ingesteld 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=update
instellen 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.auto
niet 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 hbm2ddl
de 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 deSessionFactory
wordt 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.auto
valideert 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.AvailableSettings
in 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 NONE
sinds 5.2).
Of nog beter, sinds 5.1, je kunt ook de org.hibernate.tool.schema.Action
Enum
die JPA 2 en “legacy” Hibernate combineert DDL-acties.
Maar , u kunt een DataSource
PROGRAMMATISCH 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 String
Waarde (fragment genomen van SessionFactoryBuilderImpl
):
this.schemaAutoTooling = SchemaAutoTooling.interpret( (String) configurationSettings.get( AvailableSettings.HBM2DDL_AUTO ) );
… en interne enum
Waarden van zowel org.hibernate.boot.SchemaAutoTooling
en org.hibernate.tool.schema.Action
worden niet publiekelijk blootgesteld.
Hieronder, een voorbeeldprogrammatisch DataSource
Configuratie (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-drop
bijvoorbeeld):
@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;