Skip to content

Commit

Permalink
Merge pull request eugenp#6943 from amit2103/BAEL-14320
Browse files Browse the repository at this point in the history
[BAEL-14320] - Moved code for Intro to Spring Data JPA Article
  • Loading branch information
lor6 authored May 12, 2019
2 parents bba6b88 + 1cc6422 commit 5cd0d8e
Show file tree
Hide file tree
Showing 16 changed files with 669 additions and 5 deletions.
1 change: 1 addition & 0 deletions persistence-modules/spring-persistence-simple/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
- [The DAO with Spring and Hibernate](http://www.baeldung.com/persistence-layer-with-spring-and-hibernate)
- [DAO with Spring and Generics](https://www.baeldung.com/simplifying-the-data-access-layer-with-spring-and-java-generics)
- [Transactions with Spring and JPA](https://www.baeldung.com/transaction-configuration-with-jpa-and-spring)
- [Introduction to Spring Data JPA](http://www.baeldung.com/the-persistence-layer-with-spring-data-jpa)


### Eclipse Config
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,10 @@ public List<T> findAll() {
}

@Override
public void create(final T entity) {
public T create(final T entity) {
Preconditions.checkNotNull(entity);
getCurrentSession().saveOrUpdate(entity);
return entity;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ public interface IOperations<T extends Serializable> {

List<T> findAll();

void create(final T entity);
T create(final T entity);

T update(final T entity);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,9 @@ public List<T> findAll() {
return entityManager.createQuery("from " + clazz.getName()).getResultList();
}

public void create(final T entity) {
public T create(final T entity) {
entityManager.persist(entity);
return entity;
}

public T update(final T entity) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public interface IFooDao {

List<Foo> findAll();

void create(Foo entity);
Foo create(Foo entity);

Foo update(Foo entity);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package org.baeldung.spring.data.persistence.config;

import java.util.Properties;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import com.google.common.base.Preconditions;

@Configuration
@EnableTransactionManagement
@PropertySource({ "classpath:persistence-${envTarget:h2}.properties" })
@ComponentScan({ "org.baeldung.spring.data.persistence" })
// @ImportResource("classpath*:springDataPersistenceConfig.xml")
@EnableJpaRepositories(basePackages = "org.baeldung.spring.data.persistence.dao")
public class PersistenceConfig {

@Autowired
private Environment env;

public PersistenceConfig() {
super();
}

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
em.setPackagesToScan(new String[] { "org.baeldung.spring.data.persistence.model" });

final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
// vendorAdapter.set
em.setJpaVendorAdapter(vendorAdapter);
em.setJpaProperties(additionalProperties());

return em;
}

@Bean
public DataSource dataSource() {
final DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName")));
dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("jdbc.url")));
dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("jdbc.user")));
dataSource.setPassword(Preconditions.checkNotNull(env.getProperty("jdbc.pass")));

return dataSource;
}

@Bean
public PlatformTransactionManager transactionManager() {
final JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());

return transactionManager;
}

@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}

final Properties additionalProperties() {
final Properties hibernateProperties = new Properties();
hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));
// hibernateProperties.setProperty("hibernate.globally_quoted_identifiers", "true");
return hibernateProperties;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.baeldung.spring.data.persistence.dao;

import org.baeldung.spring.data.persistence.model.Foo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
public interface IFooDao extends JpaRepository<Foo, Long> {

@Query("SELECT f FROM Foo f WHERE LOWER(f.name) = LOWER(:name)")
Foo retrieveByName(@Param("name") String name);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package org.baeldung.spring.data.persistence.model;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Foo implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

@Column(nullable = false)
private String name;

public Foo() {
super();
}

public Foo(final String name) {
super();

this.name = name;
}

// API

public long getId() {
return id;
}

public void setId(final long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(final String name) {
this.name = name;
}

//

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}

@Override
public boolean equals(final Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final Foo other = (Foo) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}

@Override
public String toString() {
final StringBuilder builder = new StringBuilder();
builder.append("Foo [name=").append(name).append("]");
return builder.toString();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.baeldung.spring.data.persistence.service;

import org.baeldung.spring.data.persistence.model.Foo;

import com.baeldung.persistence.dao.common.IOperations;

public interface IFooService extends IOperations<Foo> {

Foo retrieveByName(String name);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package org.baeldung.spring.data.persistence.service.common;

import java.io.Serializable;
import java.util.List;

import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.transaction.annotation.Transactional;

import com.baeldung.persistence.dao.common.IOperations;
import com.google.common.collect.Lists;

@Transactional
public abstract class AbstractService<T extends Serializable> implements IOperations<T> {

// read - one

@Override
@Transactional(readOnly = true)
public T findOne(final long id) {
return getDao().findById(id).orElse(null);
}

// read - all

@Override
@Transactional(readOnly = true)
public List<T> findAll() {
return Lists.newArrayList(getDao().findAll());
}

// write

@Override
public T create(final T entity) {
return getDao().save(entity);
}

@Override
public T update(final T entity) {
return getDao().save(entity);
}

@Override
public void delete(T entity) {
getDao().delete(entity);
}

@Override
public void deleteById(long entityId) {
T entity = findOne(entityId);
delete(entity);
}

protected abstract PagingAndSortingRepository<T, Long> getDao();

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package org.baeldung.spring.data.persistence.service.impl;


import org.baeldung.spring.data.persistence.model.Foo;
import org.baeldung.spring.data.persistence.dao.IFooDao;
import org.baeldung.spring.data.persistence.service.IFooService;
import org.baeldung.spring.data.persistence.service.common.AbstractService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class FooService extends AbstractService<Foo> implements IFooService {

@Autowired
private IFooDao dao;

public FooService() {
super();
}

// API

@Override
protected PagingAndSortingRepository<Foo, Long> getDao() {
return dao;
}

// custom methods

@Override
public Foo retrieveByName(final String name) {
return dao.retrieveByName(name);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package org.baeldung.util;

import java.util.Random;

public final class IDUtil {

private IDUtil() {
throw new AssertionError();
}

// API

public static String randomPositiveLongAsString() {
return Long.toString(randomPositiveLong());
}

public static String randomNegativeLongAsString() {
return Long.toString(randomNegativeLong());
}

public static long randomPositiveLong() {
long id = new Random().nextLong() * 10000;
id = (id < 0) ? (-1 * id) : id;
return id;
}

private static long randomNegativeLong() {
long id = new Random().nextLong() * 10000;
id = (id > 0) ? (-1 * id) : id;
return id;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"
>

<jpa:repositories base-package="org.baeldung.persistence.dao"/>

</beans>
Loading

0 comments on commit 5cd0d8e

Please sign in to comment.