- Innovation in Design thinking happens during teamwork. Mostly when working with people who are completely out of context.By working with people who are
not related to the problem we are solving they will come up with things which may missed.
Coach Sleeper Class NON-AC COACH (ICF)
Note
To customize request parameter data binding, we can use @InitBinder annotated methods within our controller.
@InitBinder("User") public void customizeBinding (WebDataBinder binder) { . . . }
@Controller @RequestMapping("/register") public class UserRegistrationController { @InitBinder("user") public void customizeBinding (WebDataBinder binder) { SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd"); dateFormatter.setLenient(false); binder.registerCustomEditor(Date.class, "dateOfBirth", new CustomDateEditor(dateFormatter, true)); } . . }
simpleDateFormat.setLenient(false); — Will check for out of range Date. For Example, If lenient is set to true, Aug 32 will be converted to Sep 1 .
To find the Variables assigned in JSP page use Windows->Show View->Display
Lets have a expression like one below
<c:if test="${user.isSuccess}"> . . </c:if>
Now i need to find the value of user.isSuccess you can run the below code in in Display to see the values
set in the userObject
_jspx_page_context.findAttribute("user")
It takes the value from the Page context and displays the values stored in the User Object
Note : The pageContext, _jspx_page_context are different variable names used for based on IDE while debugging JSP page.
Track Sheet
Last Updated on 20211217
Application Overview Excel
In the Spring Container the underlying persistence unit(oracle, mysql) used can be conveyed in three ways
Using Dialect in Spring(or)application.xml
<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/> <bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> </property> .... </bean> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="emf"/> <property name="jpaDialect" ref="jpaDialect"/> </bean>
We are telling ‘Spring’ to configure a transactionManager whose properties are entityManagerFactory and jpaDialect. Since these properties have to be specific to hibernate these are set according. The entityManagerFactory and jpaDialect are now set specifically to hibernate (or Vendor).
Dialect and Vendor Adapter works together
Notes:
Using Vendor in Spring(or)application.xml
<property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> </property>
the VendorAdapter is injected in to transactionManager along with entityManager
Since you have provided the class as class=”org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter”/>, this allows Spring to plug in vendor-specific behavior into Spring’s EntityManagerFactory creators and it serves as single configuration point for all vendor-specific properties.It’s a custom implementation of spring’s own JpaVendorAdapter.
The reason it is so is the underlying database differs from application to application based on the needs and the underlying persistence unit which the developer would like to use I.E MySQL, Oracle.
Using Provider persistence-context.xml
The
Note:
Application works just by configuring persistence and provider because the vendor adapter is automatically passed by the persistence provided i.e. HibernatePersistence via the getPersistenceProvider in JpaVendorAdapter.
Provider + JpaVendorAdapter(Used getPersistenceProvider to get underlying Persistence technology in our case hibernate) -> Works
Dialect + JpaVendorAdapter -> Works
Provider + Dialect -> Doesn’t Works
Difference between configuring data source in persistence.xml and spring (or) application-context.xml files
persistence-context.xml
<persistence-unit name="LocalDB" transaction-type="RESOURCE_LOCAL"> <class>domain.User</class> <exclude-unlisted-classes>true</exclude-unlisted-classes> <properties> <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/> <property name="hibernate.connection.url" value="jdbc:hsqldb:hsql://localhost"/> <property name="hibernate.hbm2ddl.auto" value="create"/> <property name="hibernate.c3p0.min_size" value="5"/> .... <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/> </properties> </persistence-unit>
application-context.xml
<bean id="domainEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="persistenceUnitName" value="JiraManager"/> <property name="dataSource" ref="domainDataSource"/> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <property name="generateDdl" value="false"/> <property name="showSql" value="false"/> <property name="databasePlatform" value="${hibernate.dialect}"/> </bean> </property> </bean> <bean id="domainDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="${db.driver}" /> <property name="jdbcUrl" value="${datasource.url}" /> <property name="user" value="${datasource.username}" /> <property name="password" value="${datasource.password}" /> <property name="initialPoolSize" value="5"/> <property name="minPoolSize" value="5"/> ..... </bean>
If you are using persistence.xml you’re creating your own connection pool and do not profit from the existing connection pool in the container. Thus even if you configured your container to, say, a max of 20 simultaneous connections to the database, you can’t guarantee this max as this new connection pool is not restrained by your configuration. Also, you don’t profit from any monitoring tools your container provides you.
If you are using spring (or) application.xml
If you’re also creating your own connection pool, with the same disadvantages as above. However, you can isolate the definition of this spring bean and only use it in test runs.Your best bet is to look up the container’s connection pool via JNDI. Then you are sure to respect the data source configurations from the container.
application-context.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:component-scan base-package="mugil.org.*" /> <tx:annotation-driven transaction-manager="transactionManager"/> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" p:dataSource-ref="dataSource" p:persistenceUnitName="simple-jpa"> </bean> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/MUSIC_STORE"/> <property name="username" value="music_store"/> <property name="password" value="music_store"/> </bean> </beans>
Dissection of application-context.xml
<context:component-scan base-package="mugil.org.*" />
Note:
When we use component-scan in the app-context.xml, it’s not necessary to use annotation-config again.Even if both the tags are specified, it’s not a problem because, the spring container would take care of running the process only once.
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/MUSIC_STORE"/> <property name="username" value="music_store"/> <property name="password" value="music_store"/> </bean>
persistence-context.xml
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="simple-jpa" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <class>mugil.pojo.MusicDetails</class> <exclude-unlisted-classes>true</exclude-unlisted-classes> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.max_fetch_depth" value="3"/> </properties> </persistence-unit> </persistence>
Dissection of persistence-context.xml
Other Java Codes
DaoInterface.java
public interface IMusicStoreDao { public List getMusicList(); }
DaoImplementation.java
@Service(value = "MusicCollections") @Repository(value = "MusicCollections") @Transactional public class MusicStoreDaoImpl implements IMusicStoreDao{ @PersistenceContext(unitName = "simple-jpa") private EntityManager entityManager; @Override public List getMusicList(){ List musicDetailsList= entityManager.createQuery("select c from MusicDetails c").getResultList(); return musicDetailsList; } }
Executer.java
public class Executer { public static void main(String[] args){ ApplicationContext applicationContext=new ClassPathXmlApplicationContext("META-INF/app-context.xml"); IMusicStoreDao musicStoreDao=(IMusicStoreDao) applicationContext.getBean("MusicCollections"); System.out.println("MusicList: \n"+musicStoreDao.getMusicList()); } }
Reference:
Spring and JPA
Sketch Notes Samples
In a Application the persistence unit used to store the data may vary.Accessing data varies depending on the source of the data. Access to persistent data varies greatly depending on the type of storage (database, flat files, xml files, and so on) and it even differs from its implementation (for example different SQL-dialects).
The advantage of the DAO layer is that if you need to change the underlying persistence mechanism you only have to change the DAO layer, and not all the places in the domain logic where the DAO layer is used from. The DAO layer usually consists of a smaller set of classes, than the number of domain logic classes that uses it.
Abstract and encapsulate all access to the data and provide an interface. This is called the Data Access Object pattern. In a nutshell, the DAO “knows” which data source (that could be a database, a flat file or even a WebService) to connect to and is specific for this data source (e.g. a OracleDAO might use oracle-specific data types, a WebServiceDAO might parse the incoming and outgoing message etc.)
BookDAO.java
public interface BookDAO { public void saveBook(Book b); public Book loadBook(String isbn); }
DBBookDAO.java
public class DBBookDAO implements BookDAO { private PreparedStatement saveStmt; private PreparedStatement loadStmt; public DBBookDAO(String url, String user, String pw) { Connection con = DriverManager.getConnection(url, user, pw); saveStmt = con.prepareStatement("INSERT INTO books(isbn, title, author) " +"VALUES (?, ?, ?)"); loadStmt = con.prepareStatement("SELECT isbn, title, author FROM books " +"WHERE isbn = ?"); } public Book loadBook(String isbn) { Book b = new Book(); loadStmt.setString(1, isbn); ResultSet result = loadStmt.executeQuery(); if (!result.next()) return null; b.setIsbn(result.getString("isbn")); b.setTitle(result.getString("title")); b.setAuthor(result.getString("author")); return b; } public void saveBook(Book b) { saveStmt.setString(1, b.getIsbn()); saveStmt.setString(2, b.getTitle()); saveStmt.setString(3, b.getAuthor()); saveStmt.executeUpdate(); } }
FileBookDAO.java
public class FileBookDAO implements BookDAO { private String basePath; public FileBookDAO(String basePath) { this.basePath = basePath; } public Book loadBook(String isbn) { FileReader fr = new FileReader(basePath + isbn); BufferedReader br = new BufferedReader(fr); Book b = new Book(); String rIsbn = br.readLine(); String rTitle = br.readLine(); String rAuthor = br.readLine(); if (rIsbn.startsWith("ISBN: ")) { b.setIsbn(rIsbn.substring("ISBN: ".length())); } else { return null; } if (rTitle.startsWith("TITLE: ")) { b.setTitle(rTitle.substring("TITLE: ".length())); } else { return null; } if (rAuthor.startsWith("AUTHOR: ")) { b.setAuthor(rAuthor.substring("AUTHOR: ".length())); } else { return null; } return b; } public void saveBook(Book b) { FileWriter fw = new FileWriter(basePath + b.getIsbn() + ".book"); fw.write("ISBN: " + b.getIsbn()); fw.write("TITLE: " + b.getTitle()); fw.write("AUTHOR: " + b.getAuthor()); fw.close(); } }