2014-01-21 7 views
5

Kontext: Verwenden von Spring Boot 0.5.0-M7, MySQL und Commons DBCP, Java-Konfiguration, @EnableAutoConfiguration festgelegt.Spring Boot JPA-Basiskonfiguration Vorrang vor App-Konfiguration

Ich habe den Antrag des DataSource Bean definiert, JpaVendorAdapter Bohne, LocalContainerEntityManagerFactoryBean und TransactionManager Bohnen mit spezifischer Konfiguration DBCP und einige Ruhen Einstellungen zu unterstützen. Beim Start der Anwendung wird die DataSource definitiv eingehalten (Debug bestätigt), aber die anderen Beans werden ignoriert. Dies scheint als Folge der JpaBaseConfiguration Klasse, die durch die WebMvcConfiguration und einer seiner Sicherheitsfilter in den Mix gebracht wird. In jedem Fall besteht das Problem unter anderem darin, dass die Hibernate-Einstellung den hbm2ddl (Schema-Export) auf drop-create setzt, sodass ich bei jedem Neustart des Servers meine Daten verliere.

Ich schaute durch die Quelle und fand, dass es scheint, Affordanz zu sein, um Umgebungsvariablen zu setzen, die in der JpaBaseConfiguration respektiert werden, jedoch scheint dies das Einrichten von Beans zu besiegen, um die gleiche Arbeit zu machen. Ich habe versucht, einige Autoconfiguration-Klassen, die sich auf Daten beziehen, ohne Erfolg auszuschließen. Gibt es eine andere Erwartung für die Einrichtung einer nicht standardmäßigen Datenkonfiguration, die ich möglicherweise vermisse?

+0

Die ddl-Einstellung sollte für MySQL "keine" sein. Sind Sie sicher, dass Sie keine eingebettete Datenbank verwenden? –

+0

Sehr sicher, sehe ich die Verbindung zu MySQL in Debug-Protokolle, meine Tabelle hat Daten, beim Neustart wurde gelöscht und neu erstellt (bestätigt in MySQL Workbench) Debuggen in SchemaExport zeigt die Drop-Create-Einstellung wirksam werden. Ich werde versuchen mit einer SNAPSHOT-Build und sehen, ob sich das Verhalten ändert. – hoserdude

Antwort

0

Dank @ dave-Syer und @ m-Deinum für Ihre Eingaben. Es stellte sich heraus, dass der SNAPSHOT-Build den Trick gemacht hat, M7 respektierte nicht meine eigenen Bohnen, aber jetzt funktionieren die Dinge wie erwartet. Für die Nachwelt habe ich die Essenz dessen, was ich in meiner App gemacht habe, extrahiert und auf das Boot-JPA-Beispiel angewendet. Die Quelle kann here gefunden werden. Dave, wenn du denkst, dass es noch einen einfacheren Weg gibt, lass es mich wissen.

9

Wenn Sie den Code für Spring Boot 0.5.0.M7 anzeigen, wenn Ruhezustand erkannt wird (HibernateEntityManager) und Federn LocalContainerEntityManagerFactoryBean, wird Hibernate standardmäßig immer konfiguriert. Sie können bestimmte Eigenschaften überschreiben, indem Sie sie in die Datei application.properties einfügen.

spring.jpa.hibernate.naming-strategy - Legt die Benennungsstrategie default = ImprovedNamingStrategy fest. spring.jpa.hibernate.ddl-auto - wird die Einstellung hibernate.hbm2ddl.auto default = create-drop setzen.

Allgemeine JPA Eigenschaften Sie

  1. spring.jpa.show-sql einstellen - Show SQL in den Protokollen
  2. spring.jpa.database-platform - für Hibernate dies ist der Dialekt
  3. spring.jpa.database - Die Datenbank verwendet (verwenden Sie nicht zusammen mit Datenbank -Plattform!).
  4. spring.jpa.generate-ddl - sollte die DDL erzeugt werden, standardmäßig false (von der spring.jpa.hibernate.ddl-auto Eigenschaft außer Kraft gesetzt) ​​

Wenn Sie wollen, dass sie einige keine Standardeigenschaften speficy Präfix mit spring.jpa.properties dann werden sie auf die jpaProperties der LocalContainterEntityManagerFactoryBean hinzugefügt werden .

Die Aufnahme der HibernateJpaAutoConfiguration ist nicht im Zusammenhang mit jeder anderen Konfiguration wird sie einfach durch die erfasste der einigen Klassen ausgelöst

@ConditionalOnClass({ LocalContainerEntityManagerFactoryBean.class, 
    EnableTransactionManagement.class, EntityManager.class, 
    HibernateEntityManager.class }) 
@ConditionalOnBean(DataSource.class) 
@EnableTransactionManagement 
+1

Ich denke, wenn Sie einen Schnappschuss verwenden, werden Sie feststellen, dass die einzelnen '@Bohnen' in der JPA-Konfiguration überschrieben werden können, indem Sie einfach Ihre eigenen bereitstellen. Wahrscheinlich mit M7 mussten Sie den Hibernate-Autokonfig explizit ausschließen. –