JPA implementations such as Eclipselink and Hibernate are one of the main-stays of a Java developers arsenal. Through a practical and well-documented interface, JPA offers cross-database portability with a common syntax and most importantly, the means of easily mapping entity objects to database tables. This mapping enables the developer to quickly develop queries using the attributes of the entities, including traversals of defined relationships in a matter that can ultimately save time and frustration.

However consideration should always be given to the possible down-sides of this approach, such as the performance drawbacks involved in retrieving what is often a data set larger than what is needed for the exact task at hand, or forms of programmatic filtering, minor mathematical functions etc that could be easily completed in by the database server itself before returning the result set, resulting in a reduced total elapsed function time. JPA also abstracts away the actual SQL that’s being executed. Whilst this can be logged additionally to regain some form of visibility and thus control, getting the query that JPA generates to match expectations (especially with table joins) can often be difficult.

In short,JPA is convenient and practical tool used in a developers daily work, but it’s important to not lose the understanding of what you’re running and when you’re not benefiting from using JPA.