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
Dank, änderte ich, wie ich 'Liste' bekommen, nicht von einer Serviceklasse mit Transaktions-, aber denselben Fehler –
besmart