DEV Community

eidher
eidher

Posted on • Edited on

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

Top comments (0)