2016-07-13 18 views
2

Ich habe eine einfache Feder Boot-Anwendung mit den folgenden Auto-Konfigurationseigenschaften:Frühling Boot - mit JPA-Repositorys mit Hibernate

spring.datasource.driver-class-name=org.postgresql.Driver 
spring.datasource.url=jdbc:postgresql://localhost:5432/mywebapp 
spring.datasource.username=username 
spring.datasource.password=password 
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect 
spring.jpa.hibernate.ddl-auto=validate 

Diese funktionieren gut und ich bin in der Lage zu Setup Spring Data JpaRepositories:

public interface UserRepository extends JpaRepository<User, String> 
{ 
    User findByName(String name); 
} 

... für folgende Einheiten:

@Entity 
public class User 
{ 
    @Id 
    @GeneratedValue(generator = "uuid") 
    @GenericGenerator(name = "uuid", strategy = "uuid2") 
    protected String uuid; 

    @Column(nullable = false) 
    private String name; 

    @Column(nullable = false) 
    private String password; 

    @Column(nullable = false) 
    private String email; 
} 

... und nutzen sie, wie dies:

@Transactional 
public void updatePassword(String username, String password) 
{ 
    User user = userRepository.findByName(username); 
    user.setEmail("[email protected]"); // This gets persisted automatically by the JpaRepository. 
} 

Jetzt habe ich Schwierigkeiten, die gleiche Sache manuell zu konfigurieren. Ich habe das versucht, folgende:

@Configuration 
@EnableTransactionManagement 
public class PersistenceConfig 
{ 
    @Bean 
    public DataSource dataSource() 
    { 
     DataSource dataSource = new DataSource(); 
     dataSource.setDriverClassName("org.postgresql.Driver"); 
     dataSource.setUrl("jdbc:postgresql://localhost:5432/mywebapp"); 
     dataSource.setUsername("username"); 
     dataSource.setPassword("password"); 

     return dataSource; 
    } 

    @Bean 
    public LocalSessionFactoryBean sessionFactory() 
    { 
     LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean(); 
     sessionFactoryBean.setDataSource(dataSource()); 
     sessionFactoryBean.setPackagesToScan("com.example.persistent"); 

     Properties hibernateProperties = new Properties(); 
     hibernateProperties.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect"); 
     hibernateProperties.setProperty("hibernate.hbm2ddl.auto", "validate"); 
     sessionFactoryBean.setHibernateProperties(hibernateProperties); 

     return sessionFactoryBean; 
    } 

    @Bean 
    public HibernateTransactionManager transactionManager() 
    { 
     HibernateTransactionManager transactionManager = new HibernateTransactionManager(); 
     transactionManager.setSessionFactory(sessionFactory().getObject()); 
     return transactionManager; 
    } 

} 

... aber während keine Ausnahmen geworfen werden, und ich kann jetzt erfolgreich aus der Datenbank gelesen, so scheint es, dass keine der Änderungen, die ich an den Entitäten machen werden persistent.

Hat jemand eine Idee, was fehlt mir für die Ausdauer zu arbeiten?

+0

auf den ersten Blick ist es ok aussieht. Konnten Sie Daten persistieren, bevor Sie die manuelle Konfiguration verwenden? Und können Sie Ihr Repository und die Klasse anzeigen, in der Sie Daten persistieren möchten. – Patrick

+0

Nur neugierig, warum interessiert Sie eine manuelle Konfiguration? –

+0

@Patrick Ich habe jetzt die Repository + Entität hinzugefügt. – glhr

Antwort

1

OP hier.

Ich habe offenbar missverstanden, dass JPA einen EntityManager anstelle einer Sitzung benötigt.

Die folgende Konfiguration funktioniert:

@Configuration 
@EnableTransactionManagement 
public class PersistenceJpaConfig 
{ 
    @Bean 
    public DataSource dataSource() 
    { 
     DataSource dataSource = new DataSource(); 
     dataSource.setDriverClassName("org.postgresql.Driver"); 
     dataSource.setUrl("jdbc:postgresql://localhost:5432/mywebapp"); 
     dataSource.setUsername("username"); 
     dataSource.setPassword("password"); 

     return dataSource; 
    } 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() 
    { 
     LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
     em.setDataSource(dataSource()); 
     em.setPackagesToScan("com.example.persistent"); 

     JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
     em.setJpaVendorAdapter(vendorAdapter); 

     Properties properties = new Properties(); 
     properties.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect"); 
     properties.setProperty("hibernate.hbm2ddl.auto", "validate"); 
     em.setJpaProperties(properties); 

     return em; 
    } 

    @Bean 
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf) 
    { 
     JpaTransactionManager transactionManager = new JpaTransactionManager(); 
     transactionManager.setEntityManagerFactory(emf); 

     return transactionManager; 
    } 

    @Bean 
    public PersistenceExceptionTranslationPostProcessor exceptionTranslation() 
    { 
     return new PersistenceExceptionTranslationPostProcessor(); 
    } 

} 
+1

Wenn Sie nur eine 'EntityManagerFactory' benötigen, brauchen Sie nur eine 'EntityManagerFactory', alles andere kann noch mit Spring Boot (Datenquelle, Trans- actionmanager) konfiguriert werden. Aber ich bezweifle wirklich wirklich, dass Sie wirklich zu dieser ganzen manuellen Konfiguration müssen, imho Sie fehlen Wissen, wie man zusätzliche Konfiguration stattdessen hinzufügt. –

Verwandte Themen