2017-11-15 2 views
0

Ich bin (verdammt ich) portiere eine SpringMVC-Anwendung, als Krieg in Tomcat zu einer SpringBootApplication eingesetzt und ich habe eine Menge Probleme, im Grunde von Hibernate.Hibernate-Konfiguration von SpringMVC zu SpringBoot

Die Anwendung wurde mit DAO/Service-Muster erstellt. Ich weiß Spring Spring möchte Spring Daten JPA verwenden, aber ich möchte nicht die gesamte Anwendung umgestalten.

Das Problem ist vor allem, dass irgendwo bekomme ich Ruhezustand Ausnahme von No Session und mehr von org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role, wo die alte SpringMVC-Anwendung funktioniert.

Zum Beispiel ich diese Entity haben

@Entity 
@Table(name = "PARK") 
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "idPark") 
public class Park implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = -7630704706109692038L; 
    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "id_park", unique = true, nullable = false) 
    private int idPark; 

    @NotEmpty 
    @Column(name = "nome_park") 
    private String nomePark; 

    @Column(name = "latitude") 
    private double latitude; 

    @Column(name = "longitude") 
    private double longitude; 

    @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.DETACH, CascadeType.REFRESH}, mappedBy = "park") 
    @JsonIgnore 
    private List<Piano> piani; 
//getters and setters 

In einem Controller, wenn ich

List<Piano> piani = pianoService.findPianoByPark(park); 

von meiner Dienstklasse mit @Transactional Anmerkung aufrufen, erhalte ich immer noch die Ausnahme

Dies ist Wie konfigurierte ich Hibernate

@Configuration 
@EnableTransactionManagement 
@ComponentScan({ "it.besmart.epark.persistence" }) 
@PropertySource(value = { "classpath:application.properties" }) 
public class HibernateConfiguration { 

@Autowired 
private Environment environment; 

@Bean 
public LocalSessionFactoryBean sessionfactory(){ 
    LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); 
    sessionFactory.setDataSource(dataSource()); 
    sessionFactory.setPackagesToScan(new String[] {"it.besmart.epark.persistence.model"}); 
    sessionFactory.setHibernateProperties(hibernateProperties()); 
    return sessionFactory; 
} 

@Bean 
public DataSource dataSource() { 
    DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
    dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName")); 
    dataSource.setUrl(environment.getRequiredProperty("jdbc.url")); 
    dataSource.setUsername(environment.getRequiredProperty("jdbc.username")); 
    dataSource.setPassword(environment.getRequiredProperty("jdbc.password")); 
    return dataSource; 
} 

private Properties hibernateProperties() { 
    Properties properties = new Properties(); 
    properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect")); 
    properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql")); 
    properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql")); 
    return properties;   
} 

@Bean 
@Autowired 
public HibernateTransactionManager transactionManager(SessionFactory s) { 
    HibernateTransactionManager txManager = new HibernateTransactionManager(); 
    txManager.setSessionFactory(s); 
    return txManager; 
} 
} 

Ich denke, es ist eine Frage der Konfiguration, weil die alte Anwendung mit diesem Schema funktioniert, also müssen wir vielleicht mit Spring Boot etwas anderes konfigurieren, um mit Hibernate zu arbeiten. Ich benutze Spring Boot 1.5.8 und so Hibernate 5.0.12.Final

Antwort

0

Ich denke, Sie versuchen, eine lazy-loaded Sammlung außerhalb einer Hibernate-Transaktion (z. B. in Sicht, Controller oder nicht transaktional) zu holen Bedienung). Sie können versuchen, die Klasse mit getPiani() Anruf mit @Transactional annotieren.

Denken Sie auch daran, dass es eine gute Vorgehensweise ist, nur eine Transaktion auf Serviceebene zu verwenden.

+0

Dank, änderte ich, wie ich 'Liste ' bekommen, nicht von einer Serviceklasse mit Transaktions-, aber denselben Fehler – besmart

0

Wenn Sie alle erforderlichen Abhängigkeiten im Klassenpfad haben, sollten Sie Hibernate nicht mehr explizit konfigurieren müssen. Stellen Sie also sicher, dass Sie spring-boot-starter-data-jpa oder spring-boot-starter-data-jdbc als Abhängigkeit hinzugefügt haben.

Try HibernateConfiguration zu löschen und fügen Sie Ihre Konfiguration in Ihrer application.properties so Frühlings-Boot das Setup umgehen kann:

spring.jpa.database-platform = org.hibernate.dialect.PostgreSQL94Dialect 
spring.jpa.show-sql = false 
spring.datasource.url = jdbc:... 
spring.datasource.username = ... 
spring.datasource.password = ... 
spring.datasource.driver-class-name=...jdbc.Driver 

Sie können mehr über die Datenbankkonfiguration mit Frühlings-Boot hier lesen: https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html Referenz für verfügbare Anwendungseigenschaften : https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

Spring Boot sollte Ihre Entitäten automatisch aufnehmen, solange Sie sie nicht deaktivieren. Wenn Sie definitiv ein Paket angeben müssen, können Sie dies mit tun. Zum Beispiel mussten wir dies einmal tun, wenn unsere Entitäten in einem anderen Projekt als unserer Anwendungsklasse waren.

@SpringBootApplication 
@EntityScan(basePackages = { "it.besmart.epark.persistence" }) 
public class Application { 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 
} 
+0

Dank, ich bin bewegt alle die Konfiguration auf die application.properties, aber ich bin immer ' org.hibernate.MappingException: Unbekannte Entität: 'exception und ich kann die Eigenschaft nicht finden, um die Pakete so einzustellen, dass sie meine Entity-Klassen scannen – besmart

+0

Ich habe meine Antwort bearbeitet. Wenn Sie immer noch Probleme haben, schreiben Sie bitte Ihre Spring-Anwendungsklasse. – fap