I was using Google guice
in my project and now I tried to convert the framework to SpringBoot
totally.
I configured the Bean for persistence.xml
like below in
@Autowired @Bean(name = "transactionManager") public LocalContainerEntityManagerFactoryBean entityManagerFactory() { LocalContainerEntityManagerFactoryBean lEMF = new LocalContainerEntityManagerFactoryBean(); lEMF.setPersistenceUnitName("leaseManagementPU"); lEMF.setPersistenceXmlLocation("persistence.xml"); return lEMF; }
Now I need to configure(Inject) EntityManager
em, to do JPA operations
like em.persist()
, em.find
etc... How do I configure, also someone try to explain this with sample code
The complete example of getting EntityManager using the custom configuration in Spring Boot. Open eclipse and create maven project, Don't forget to check 'Create a simple project (skip)'click on next. Fill all details(GroupId – entitymanager, ArtifactId – entitymanager and name – entitymanager) and click on finish.
The EntityManager API is used to create and remove persistent entity instances, to find entities by their primary key, and to query over entities. The set of entities that can be managed by a given EntityManager instance is defined by a persistence unit.
With Spring Boot
its not necessary to have any config file like persistence.xml
. You can configure with annotations
Just configure your DB config for JPA in the
spring.datasource.driverClassName=oracle.jdbc.driver.OracleDriver spring.datasource.url=jdbc:oracle:thin:@DB... spring.datasource.username=username spring.datasource.password=pass spring.jpa.database-platform=org.hibernate.dialect.... spring.jpa.show-sql=true
Then you can use CrudRepository
provided by Spring where you have standard CRUD
transaction methods. There you can also implement your own SQL's
like JPQL
.
@Transactional public interface ObjectRepository extends CrudRepository<Object, Long> { ... }
And if you still need to use the Entity Manager
you can create another class.
public class ObjectRepositoryImpl implements ObjectCustomMethods{ @PersistenceContext private EntityManager em; }
This should be in your pom.xml
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.2.5.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>4.3.11.Final</version> </dependency> </dependencies>
Hmmm you can find lot of examples for configuring spring framework. Anyways here is a sample
@Configuration @Import({PersistenceConfig.class}) @ComponentScan(basePackageClasses = { ServiceMarker.class, RepositoryMarker.class } ) public class AppConfig { }
@Configuration @PropertySource(value = { "classpath:database/jdbc.properties" }) @EnableTransactionManagement public class PersistenceConfig { private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect"; private static final String PROPERTY_NAME_HIBERNATE_MAX_FETCH_DEPTH = "hibernate.max_fetch_depth"; private static final String PROPERTY_NAME_HIBERNATE_JDBC_FETCH_SIZE = "hibernate.jdbc.fetch_size"; private static final String PROPERTY_NAME_HIBERNATE_JDBC_BATCH_SIZE = "hibernate.jdbc.batch_size"; private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql"; private static final String[] ENTITYMANAGER_PACKAGES_TO_SCAN = {"a.b.c.entities", "a.b.c.converters"}; @Autowired private Environment env; @Bean(destroyMethod = "close") public DataSource dataSource() { BasicDataSource dataSource = new BasicDataSource(); dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName")); dataSource.setUrl(env.getProperty("jdbc.url")); dataSource.setUsername(env.getProperty("jdbc.username")); dataSource.setPassword(env.getProperty("jdbc.password")); return dataSource; } @Bean public JpaTransactionManager jpaTransactionManager() { JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(entityManagerFactoryBean().getObject()); return transactionManager; } private HibernateJpaVendorAdapter vendorAdaptor() { HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); vendorAdapter.setShowSql(true); return vendorAdapter; } @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() { LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); entityManagerFactoryBean.setJpaVendorAdapter(vendorAdaptor()); entityManagerFactoryBean.setDataSource(dataSource()); entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class); entityManagerFactoryBean.setPackagesToScan(ENTITYMANAGER_PACKAGES_TO_SCAN); entityManagerFactoryBean.setJpaProperties(jpaHibernateProperties()); return entityManagerFactoryBean; } private Properties jpaHibernateProperties() { Properties properties = new Properties(); properties.put(PROPERTY_NAME_HIBERNATE_MAX_FETCH_DEPTH, env.getProperty(PROPERTY_NAME_HIBERNATE_MAX_FETCH_DEPTH)); properties.put(PROPERTY_NAME_HIBERNATE_JDBC_FETCH_SIZE, env.getProperty(PROPERTY_NAME_HIBERNATE_JDBC_FETCH_SIZE)); properties.put(PROPERTY_NAME_HIBERNATE_JDBC_BATCH_SIZE, env.getProperty(PROPERTY_NAME_HIBERNATE_JDBC_BATCH_SIZE)); properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, env.getProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL)); properties.put(AvailableSettings.SCHEMA_GEN_DATABASE_ACTION, "none"); properties.put(AvailableSettings.USE_CLASS_ENHANCER, "false"); return properties; } }
public static void main(String[] args) { try (GenericApplicationContext springContext = new AnnotationConfigApplicationContext(AppConfig.class)) { MyService myService = springContext.getBean(MyServiceImpl.class); try { myService.handleProcess(fromDate, toDate); } catch (Exception e) { logger.error("Exception occurs", e); myService.handleException(fromDate, toDate, e); } } catch (Exception e) { logger.error("Exception occurs in loading Spring context: ", e); } }
@Service public class MyServiceImpl implements MyService { @Inject private MyDao myDao; @Override public void handleProcess(String fromDate, String toDate) { List<Student> myList = myDao.select(fromDate, toDate); } }
@Repository @Transactional public class MyDaoImpl implements MyDao { @PersistenceContext private EntityManager entityManager; public Student select(String fromDate, String toDate){ TypedQuery<Student> query = entityManager.createNamedQuery("Student.findByKey", Student.class); query.setParameter("fromDate", fromDate); query.setParameter("toDate", toDate); List<Student> list = query.getResultList(); return CollectionUtils.isEmpty(list) ? null : list; } }
Assuming maven project: Properties file should be in src/main/resources/database
folder
jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=your db url jdbc.username=your Username jdbc.password=Your password hibernate.max_fetch_depth = 3 hibernate.jdbc.fetch_size = 50 hibernate.jdbc.batch_size = 10 hibernate.show_sql = true
ServiceMarker and RepositoryMarker are just empty interfaces in your service or repository impl package.
Let's say you have package name a.b.c.service.impl
. MyServiceImpl is in this package and so is ServiceMarker.
public interface ServiceMarker { }
Same for repository marker. Let's say you have a.b.c.repository.impl
or a.b.c.dao.impl
package name. Then MyDaoImpl is in this this package and also Repositorymarker
public interface RepositoryMarker { }
//dummy class and dummy query @Entity @NamedQueries({ @NamedQuery(name="Student.findByKey", query="select s from Student s where s.fromDate=:fromDate" and s.toDate = :toDate) }) public class Student implements Serializable { private LocalDateTime fromDate; private LocalDateTime toDate; //getters setters }
@Converter(autoApply = true) public class LocalDateTimeConverter implements AttributeConverter<LocalDateTime, Timestamp> { @Override public Timestamp convertToDatabaseColumn(LocalDateTime dateTime) { if (dateTime == null) { return null; } return Timestamp.valueOf(dateTime); } @Override public LocalDateTime convertToEntityAttribute(Timestamp timestamp) { if (timestamp == null) { return null; } return timestamp.toLocalDateTime(); } }
<properties> <java-version>1.8</java-version> <org.springframework-version>4.2.1.RELEASE</org.springframework-version> <hibernate-entitymanager.version>5.0.2.Final</hibernate-entitymanager.version> <commons-dbcp2.version>2.1.1</commons-dbcp2.version> <mysql-connector-java.version>5.1.36</mysql-connector-java.version> <junit.version>4.12</junit.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${org.springframework-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${org.springframework-version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>${hibernate-entitymanager.version}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql-connector-java.version}</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>${commons-dbcp2.version}</version> </dependency> </dependencies> <build> <finalName>${project.artifactId}</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.3</version> <configuration> <source>${java-version}</source> <target>${java-version}</target> <compilerArgument>-Xlint:all</compilerArgument> <showWarnings>true</showWarnings> <showDeprecation>true</showDeprecation> </configuration> </plugin> </plugins> </build>
Hope it helps. Thanks
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With