JPA with Spring

eidher

eidher

Posted on October 25, 2020

JPA with Spring

To use JPA with Spring we need to implement the next 4 steps.

Define mapping metadata in entities

Use the next annotations:

  • Entity: Mandatory. Marks the class as a JPA persistent class
  • Table: Specifies the exact table name to use on the DB (would be the class name if unspecified)
  • Id: Mandatory. Indicates the field to use as the primary key on the database
  • Column: Name of the column on the table (would be the field name if unspecified)
  • OneToMany: Identifies the field on the 'one' side of a one to many relationship
  • JoinColumn: Identifies the column on the 'many' table containing the column to be used when joining. Usually a foreign key.
  • Transient: Not stored in database
@Entity
@Table(name="T_ACCOUNT")
public class Account {

    @Id
    @Column(name="ID")
    private Long entityId;

    @Transient
    private String number;
    ...
}
Enter fullscreen mode Exit fullscreen mode

Define an EntityManagerFactory bean

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
        adapter.setShowSql(true);
        adapter.setGenerateDdl(true); // creating/updating tables (be careful)
        adapter.setDatabase(Database.HSQL);
        Properties props = new Properties();
        props.setProperty("hibernate.format_sql", "true");
        LocalContainerEntityManagerFactoryBean emfb = 
            new LocalContainerEntityManagerFactoryBean();
        emfb.setDataSource(dataSource());
        emfb.setPackagesToScan("com");
        emfb.setJpaProperties(props);
        emfb.setJpaVendorAdapter(adapter);
        return emfb;
    }
Enter fullscreen mode Exit fullscreen mode

Define Transaction Manager and DataSource beans

    @Bean
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
        return new JpaTransactionManager(emf);
    }

    @Bean
    public DataSource dataSource(){
        return
            (new EmbeddedDatabaseBuilder())
            .addScript("classpath:schema.sql")
            .addScript("classpath:data.sql")
            .build();
    }
Enter fullscreen mode Exit fullscreen mode

Define Repository/DAO

@Repository("accountRepository")
public class JpaAccountRepository implements AccountRepository {

    @PersistenceContext
    private EntityManager entityManager;

    @Override
    public Account findByNumber(String number) {
        String jpql = "SELECT a FROM Account a where a.number = :number";
        Account account = entityManager.createQuery(jpql, Account.class)
                .setParameter("number", number).getSingleResult();
        return account;
    }
}
Enter fullscreen mode Exit fullscreen mode
💖 💪 🙅 🚩
eidher
eidher

Posted on October 25, 2020

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related

JPA with Spring Boot
spring JPA with Spring Boot

November 8, 2020

JPA with Spring
spring JPA with Spring

October 25, 2020