Java Persistence API (JPA) provides a collection of classes and methods that can be used to persistently store large amounts of data into a database. ORM or Object-Relational Mapping is one way to implement JPA. JPA bridges the gap between object model (Java code) and the relational model (database). It reduces the burden of interacting with the database significantly.  JPA provides an ORM layer through frameworks like Hibernate ORM which generates the required code for object-relational mapping. Here, the classes become the table names and the fields (properties) become the table columns. Several implementations are available for JPA. The more popular of these are Hibernate, EclipseLink and Apache OpenJPA. Using JPA, a developer can work directly with objects as opposed to working with SQL statements which is why JPA implementation is also called as Persistence Provider. Persistence Metadata is where the mapping between Java objects and database tables is defined.  The JPA provider will use this metadata information to perform the correct database operations. The JPA metadata can be defined using annotations in the Java class or through XML. It could also be a combination of both depending on the necessity. If there is an XML configuration, it will take priority and overwrite the annotations. JPA specifications are defined in the java.persistence package.