Hinweis lernen: Update # 1 und Update # 2 hat UserDAOImpl.java, HibernateConfig.java, UserServiceImpl.javamuss ich über org.hibernate.HibernateException
näher erhalten, wie ich
wissen, dass Sie eine Transaktion von Hibernate SessionFactory sein müssen. Das Ausführen von Abfragen nach dem Abrufen der Sitzung mit getCurrentSession() funktioniert erst, wenn Sie eine Transaktion ausführen. Wenn Sie also @Transactional in Ihrem @Repository oder @Service verwenden, würde Spring eine Transaktion für Abfragen seiner Methode anwenden.
Warum EntityManager, nicht Transaktion benötigen werde ich in
grabenIch muss wissen, was diese Ausnahme zu lesen, um zu verstehen, was bedeutet:
org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
Ich weiß, dass einige Antworten schlägt @EnableTransactionManagement, und einige Antworten @Transactional, ich werde Lösungen für jetzt kopieren/einfügen.
Ich bin ein sehr einfacher Benutzer, ich weiß nicht viel über RDBMS, ich kenne die Grundlagen des Umgangs mit MySQL, also Wenn Sie nur eine Reihe von Themen zum Lesen auflisten könnten, wäre das genug.
Update # 1
Ich habe zwei Abfragen, die eine Arbeit und das andere gibt mir diese Ausnahme und ich habe nicht @Transactional auf keinem meiner Serviceklassen:
UserDAOImpl.java
@Component
public class UserDAOImpl implements UserDAO {
@Autowired
private SessionFactory sessionFactory;
// Works well
@Override
public User findByUsername(String username) {
return (User) sessionFactory.createEntityManager()
.createQuery("from User where username = :username")
.setParameter("username", username)
.getSingleResult();
}
// Gives me the exception
@Override
public User findByUsernameOneColumn(String username, String column) {
return (User) sessionFactory.getCurrentSession()
.createQuery("select :column from User where username = :username")
.setParameter("column", column)
.setParameter("username", username)
.getSingleResult();
}
}
Deshalb brauchte ich mehr zu lesen und nicht kopieren und einfügen, sollte ich nicht -1 gegeben werden, muss ich gut lernen.
Update # 2
HibernateConfig.java
@Configuration
@EnableTransactionManagement
public class HibernateConfig {
@Bean
public DataSource dataSource() {
DataSource dataSource = new DataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/medicallabDB");
dataSource.setUsername("root");
dataSource.setPassword("root");
return dataSource;
}
@Bean
public HibernateTransactionManager transactionManager() {
return new HibernateTransactionManager(sessionFactory().getObject());
}
@Bean
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean localSessionFactory = new LocalSessionFactoryBean();
try {
localSessionFactory.setDataSource(dataSource());
localSessionFactory.setHibernateProperties(hibernateProperties());
localSessionFactory.setPackagesToScan("medicallab.web.model");
localSessionFactory.afterPropertiesSet();
} catch (Exception e) {
e.printStackTrace();
}
return localSessionFactory;
}
private Properties hibernateProperties() {
Properties hibernateProperties = new Properties();
hibernateProperties.setProperty("dialect", "org.hibernate.dialect.MySQLDialect");
hibernateProperties.setProperty("hibernate.show_sql", "true");
hibernateProperties.setProperty("hibernate.hbm2ddl.auto", "update");
return hibernateProperties;
}
}
UserServiceImpl.java
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDAO userDAO;
public User findByUsername(String username) {
return userDAO.findByUsername(username);
}
@Override
public User findByUsernameOneColumn(String username, String column) {
User user = null;
try {
user = userDAO.findByUsernameOneColumn(username, column);
System.out.println("user object" + user);
} catch(Exception e) {
e.printStackTrace();
}
return user;
}
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = findByUsername(username);
if (user == null) {
throw new UsernameNotFoundException("No such user: " + username);
}
return new User(user);
}
}
Ich habe meine Frage aktualisiert, um Text klar zu machen. –
Bitte laden Sie Ihren vollständigen Code hoch. Und erkläre deine Frage richtig – Shanmugapriya
Okay @ Shanmugapriya, das ist, warum die Frage über das Lernen, so dass ich nicht verschiedene Kopie/Paste anwenden, bis ich das Problem bestehen, bereite ich es vor. –