Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Esta es la clase abstracta, la anotación @PersistenceContext venía en el ejemplo
- public abstract class AbstractJpaDao< T extends Serializable > {
- private Class< T > clazz;
- @PersistenceContext
- @Qualifier("entityManager")
- EntityManager entityManager;
- public void setClazz( Class< T > clazzToSet ) {
- this.clazz = clazzToSet;
- }
- public T getById( Long id ){
- return entityManager.find( clazz, id );
- }
- ...
- }
- Luego creo la clase Producto para el modelo de datos
- @Entity
- @Table(name="Producto")
- public class Producto implements Serializable {
- @Id
- //@GeneratedValue(strategy=GenerationType.IDENTITY)
- private Long id;
- @Column(name="nombre")
- private String nombre;
- @Column(name="precio")
- private double precio;
- ...
- }
- y finalmente la clase que en que vamos a realizar las operaciones que hereda de AbstractJpaDao a la que se
- le debe inyectar en objeto EntityManager.
- @Repository
- public class ProductoImpl extends AbstractJpaDao<Producto>
- {
- public ProductoImpl()
- {
- setClazz(Producto.class);
- }
- public Producto findOne(long productoId) {
- return getById(productoId);
- }
- ...
- }
- El archivo de configuración para Spring es:
- @Configuration
- @ComponentScan({"hibernatejpa.common","hibernatejpa.persistencia"})
- public class ConfiguracionSpring {
- // private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("Persistencia");
- @Bean(name="entityManager")
- public EntityManager entityManager() {
- EntityManagerFactory emf = Persistence.createEntityManagerFactory("Persistencia");
- return emf.createEntityManager();
- }
- }
- que carga del archivo persistence.xml que tengo en META-INF, el archivo es correcto porque si lo pruebo directamente
- sin pasar por creando el EntityManagerFactory y el EntityManager en un test funciona todo correcto.
- En un clase de pruebas en el main pruebo lo siguiente;
- public static void main(String[] args) {
- AnnotationConfigApplicationContext contexto = new AnnotationConfigApplicationContext(ConfiguracionSpring.class);
- Producto producto1 = new Producto();
- producto1.setId(5L);
- producto1.setNombre("Martillo");
- producto1.setPrecio(300);
- ProductoImpl creaProducto = new ProductoImpl();
- creaProducto.create(producto1);
- }
- Me lanza la excepción siguiente:
- Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'productoImpl': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'javax.persistence.EntityManagerFactory' available
- Pero ahora si en public abstract class AbstractJpaDao< T extends Serializable > cambio @PersistenceContext por @Autowired
- @Autowired
- @Qualifier("entityManager")
- EntityManager entityManager;
- y cambio en la clase que hereda ProductoImpl la anotación @Repository por @Component("ProductoImpl")
- @Component("ProductoImpl")
- public class ProductoImpl extends AbstractJpaDao<Producto>
- El error ahora es el error es el siguiente
- java.lang.NullPointerException
- at hibernatejpa.common.AbstractJpaDao.save(AbstractJpaDao.java:39)
- at hibernatejpa.persistencia.ProductoImpl.create(ProductoImpl.java:54)
- at pruebas.PruebaProducto01.main(PruebaProducto01.java:30)
- es decir parece que inyecta el Bean pero null ya que llega hasta este punto que es dónde casca la cosa
- public void save( T entity ){
- entityManager.getTransaction().begin();
- entityManager.persist( entity );
- entityManager.getTransaction().commit();
- entityManager.close();
- }
- Si inserto el registro directamente sin usar las clases ni inyectar el Bean
- entonces funciona, por lo tanto descarto que sea del driver, ni del persistence.xml ni de la BD
- public static void main(String[] args) {
- EntityManagerFactory emf = Persistence.createEntityManagerFactory("Persistencia");
- EntityManager manager = emf.createEntityManager();
- Producto producto1 = new Producto();
- producto1.setId(5L);
- producto1.setNombre("Martillo");
- producto1.setPrecio(300);
- manager.getTransaction().begin();
- manager.persist( producto1 );
- manager.getTransaction().commit();
- manager.close();
- }
- No sé que errores estoy cometiendo, a ver si alguien me hecha una mano para crear e inyectar el bean.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement