Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

294
Visualizações
¿Puedo colocar la anotación @Transactional en una clase de entidad?

Estoy probando el patrón Active Record usando el marco Spring e Hibernate. A continuación se muestra la descripción de este patrón:

Un objeto transporta tanto datos como comportamiento. Gran parte de estos datos son persistentes y deben almacenarse en una base de datos. Active Record utiliza el enfoque más obvio, colocando la lógica de acceso a datos en el objeto de dominio. De esta manera, todas las personas saben cómo leer y escribir sus datos hacia y desde la base de datos.

Entonces, eliminé la clase Service tradicional y moví su lógica y la anotación @Transactional a la clase de entidad. Pero cuando ejecuto mi aplicación nuevamente, se lanzó la siguiente excepción.

 org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread org.springframework.orm.hibernate5.SpringSessionContext.currentSession(SpringSessionContext.java:133) org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:454) weibo.datasource.UserDao.save(UserDao.java:17) weibo.domain.User.register(User.java:32) weibo.web.UserController.register(UserController.java:29)

Código fuente

La clase UserController :

 @PostMapping("/users/register") public String register(@RequestParam("username") String username, @RequestParam("password") String password) { User user = new User(userDao, username, password); user.register(); return "redirect:/users/login"; }

La clase de entidad User :

 @Entity @Table(name="USERS") @Transactional public class User { @Id @GeneratedValue private int id; private String name; private String password; @Transient private UserDao userDao; public User() {} public User(UserDao userDao, String username, String password) { ... } public void register() { userDao.save(this); } }

La clase UserDao . No @Transactional anotado.

 public UserDao(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public void save(User user) { sessionFactory.getCurrentSession().save(user); }

¿Por qué?

ACTUALIZAR

Como dijo @cristianhh, la anotación @Transactional debe usarse en un bean administrado por Spring . Sin embargo, la clase de entidad no lo es.

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

No, mientras @Transactional es administrado por Spring, @Entity es administrado por Hibernate.

Los beans de Hibernate no son administrados por Spring y, respectivamente, no pueden ser envueltos por la anotación @Transactional .

Sin embargo, puede usar @Transactional en la capa de servicio/repositorio y ajustar una función que envíe el objeto de acceso a datos (DAO) de la entidad.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda