2015-10-12 3 views
13

Я использовал Google guice в своем проекте, и теперь я попытался полностью преобразовать фреймворк в SpringBoot.Spring boot - configure EntityManager

я настроил Bean для persistence.xml как ниже в

@Autowired 
@Bean(name = "transactionManager") 
public LocalContainerEntityManagerFactoryBean entityManagerFactory() 
{ 
    LocalContainerEntityManagerFactoryBean lEMF = new LocalContainerEntityManagerFactoryBean(); 
    lEMF.setPersistenceUnitName("leaseManagementPU"); 
    lEMF.setPersistenceXmlLocation("persistence.xml"); 
    return lEMF; 
} 

Теперь нужно настроить (Inject) EntityManager их, делать операции JPA как em.persist(), em.find и т.д .. Как мне настроить, также кто-то попытается объяснить это с помощью кода примера

ответ

27

С Spring Boot его не нужно иметь никакого конфигурационного файла, такого как persistence.xml. Вы можете настроить с annotations Просто настроить БД конфигурации для JPA в

application.properties

spring.datasource.driverClassName=oracle.jdbc.driver.OracleDriver 
spring.datasource.url=jdbc:oracle:thin:@DB... 
spring.datasource.username=username 
spring.datasource.password=pass 

spring.jpa.database-platform=org.hibernate.dialect.... 
spring.jpa.show-sql=true 

Затем вы можете использовать CrudRepository предоставляемые Spring, где у вас есть стандартные методы CRUD транзакций. Там вы также можете реализовать свой собственный SQL's, как JPQL.

@Transactional 
public interface ObjectRepository extends CrudRepository<Object, Long> { 
... 
} 

И если вам все еще нужно использовать Entity Manager вы можете создать еще один класс.

public class ObjectRepositoryImpl implements ObjectCustomMethods{ 

    @PersistenceContext 
    private EntityManager em; 

} 

Это должно быть в вашем pom.xml

<parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.2.5.RELEASE</version> 
    </parent> 

    <dependencies> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-jpa</artifactId> 
     </dependency> 


     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-orm</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-core</artifactId> 
      <version>4.3.11.Final</version> 
     </dependency> 
+0

Спасибо, возможно ли использовать JPARepository вместо репозитория CRUD. whats the diff –

+0

Я думаю, что это не должно быть проблемой. [Здесь] (http://docs.spring.io/spring-data/jpa/docs/1.3.0.RELEASE/reference/html/jpa.repositories.html) является хорошей документацией. – Patrick

+1

@Patrick, если есть пользовательские источники данных, подключающиеся к другой базе данных. В таком случае вам не нужно было бы использовать отдельные сущ. Как можно было бы перейти в свойствах спящего режима в таком случае? – user3869813

12

Хммм вы можете найти много примеров для настройки рамки пружины. В любом случае здесь образец

@Configuration 
@Import({PersistenceConfig.class}) 
@ComponentScan(basePackageClasses = { 
    ServiceMarker.class, 
    RepositoryMarker.class } 
) 
public class AppConfig { 

} 

PersistenceConfig

@Configuration 
@PropertySource(value = { "classpath:database/jdbc.properties" }) 
@EnableTransactionManagement 
public class PersistenceConfig { 

    private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect"; 
    private static final String PROPERTY_NAME_HIBERNATE_MAX_FETCH_DEPTH = "hibernate.max_fetch_depth"; 
    private static final String PROPERTY_NAME_HIBERNATE_JDBC_FETCH_SIZE = "hibernate.jdbc.fetch_size"; 
    private static final String PROPERTY_NAME_HIBERNATE_JDBC_BATCH_SIZE = "hibernate.jdbc.batch_size"; 
    private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql"; 
    private static final String[] ENTITYMANAGER_PACKAGES_TO_SCAN = {"a.b.c.entities", "a.b.c.converters"}; 

    @Autowired 
    private Environment env; 

    @Bean(destroyMethod = "close") 
    public DataSource dataSource() { 
     BasicDataSource dataSource = new BasicDataSource(); 
     dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName")); 
     dataSource.setUrl(env.getProperty("jdbc.url")); 
     dataSource.setUsername(env.getProperty("jdbc.username")); 
     dataSource.setPassword(env.getProperty("jdbc.password")); 
     return dataSource; 
    } 

    @Bean 
    public JpaTransactionManager jpaTransactionManager() { 
     JpaTransactionManager transactionManager = new JpaTransactionManager(); 
     transactionManager.setEntityManagerFactory(entityManagerFactoryBean().getObject()); 
     return transactionManager; 
    } 

    private HibernateJpaVendorAdapter vendorAdaptor() { 
     HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
     vendorAdapter.setShowSql(true); 
     return vendorAdapter; 
    } 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() { 

     LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); 
     entityManagerFactoryBean.setJpaVendorAdapter(vendorAdaptor()); 
     entityManagerFactoryBean.setDataSource(dataSource()); 
     entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class); 
     entityManagerFactoryBean.setPackagesToScan(ENTITYMANAGER_PACKAGES_TO_SCAN);    
     entityManagerFactoryBean.setJpaProperties(jpaHibernateProperties()); 

     return entityManagerFactoryBean; 
    } 

    private Properties jpaHibernateProperties() { 

     Properties properties = new Properties(); 

     properties.put(PROPERTY_NAME_HIBERNATE_MAX_FETCH_DEPTH, env.getProperty(PROPERTY_NAME_HIBERNATE_MAX_FETCH_DEPTH)); 
     properties.put(PROPERTY_NAME_HIBERNATE_JDBC_FETCH_SIZE, env.getProperty(PROPERTY_NAME_HIBERNATE_JDBC_FETCH_SIZE)); 
     properties.put(PROPERTY_NAME_HIBERNATE_JDBC_BATCH_SIZE, env.getProperty(PROPERTY_NAME_HIBERNATE_JDBC_BATCH_SIZE)); 
     properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, env.getProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL)); 

     properties.put(AvailableSettings.SCHEMA_GEN_DATABASE_ACTION, "none"); 
     properties.put(AvailableSettings.USE_CLASS_ENHANCER, "false");  
     return properties;  
    } 

} 

Главная

public static void main(String[] args) { 
    try (GenericApplicationContext springContext = new AnnotationConfigApplicationContext(AppConfig.class)) { 
     MyService myService = springContext.getBean(MyServiceImpl.class); 
     try { 
      myService.handleProcess(fromDate, toDate); 
     } catch (Exception e) { 
      logger.error("Exception occurs", e); 
      myService.handleException(fromDate, toDate, e); 
     } 
    } catch (Exception e) { 
     logger.error("Exception occurs in loading Spring context: ", e); 
    } 
} 

MyService

@Service 
public class MyServiceImpl implements MyService { 

    @Inject 
    private MyDao myDao; 

    @Override 
    public void handleProcess(String fromDate, String toDate) { 
     List<Student> myList = myDao.select(fromDate, toDate); 
    } 
} 

MyDoaImpl

@Repository 
@Transactional 
public class MyDaoImpl implements MyDao { 

    @PersistenceContext 
    private EntityManager entityManager; 

    public Student select(String fromDate, String toDate){ 

     TypedQuery<Student> query = entityManager.createNamedQuery("Student.findByKey", Student.class); 
     query.setParameter("fromDate", fromDate); 
     query.setParameter("toDate", toDate); 
     List<Student> list = query.getResultList(); 
     return CollectionUtils.isEmpty(list) ? null : list; 
    } 

} 

Предполагая Maven проект: Properties файл должен быть в папке src/main/recourses/database

jdbc.properties файл

jdbc.driverClassName=com.mysql.jdbc.Driver 
jdbc.url=your db url 
jdbc.username=your Username 
jdbc.password=Your password 

hibernate.max_fetch_depth = 3 
hibernate.jdbc.fetch_size = 50 
hibernate.jdbc.batch_size = 10 
hibernate.show_sql = true 

ServiceMarker и RepositoryMarker лишь пустые интерфейсы в вашей услуге или хранилище пакета осущ.

Предположим, у вас есть имя пакета a.b.c.service.impl. MyServiceImpl находится в этом пакете, а также ServiceMarker.

public interface ServiceMarker { 

} 

То же самое для репорирования маркера. Скажем, у вас есть a.b.c.repository.impl или a.b.c.dao.impl название пакета.Тогда MyDaoImpl в этом пакете, а также Repositorymarker

public interface RepositoryMarker { 

} 

abcentities.Student

//dummy class and dummy query 
@Entity 
@NamedQueries({ 
@NamedQuery(name="Student.findByKey", query="select s from Student s where s.fromDate=:fromDate" and s.toDate = :toDate) 
}) 
public class Student implements Serializable { 

    private LocalDateTime fromDate; 
    private LocalDateTime toDate; 

    //getters setters 

} 

abcconverters

@Converter(autoApply = true) 
public class LocalDateTimeConverter implements AttributeConverter<LocalDateTime, Timestamp> { 

    @Override 
    public Timestamp convertToDatabaseColumn(LocalDateTime dateTime) { 

     if (dateTime == null) { 
      return null; 
     } 
     return Timestamp.valueOf(dateTime); 
    } 

    @Override 
    public LocalDateTime convertToEntityAttribute(Timestamp timestamp) { 

     if (timestamp == null) { 
      return null; 
     }  
     return timestamp.toLocalDateTime(); 
    } 
} 

pom.xml

<properties> 
    <java-version>1.8</java-version> 
    <org.springframework-version>4.2.1.RELEASE</org.springframework-version> 
    <hibernate-entitymanager.version>5.0.2.Final</hibernate-entitymanager.version> 
    <commons-dbcp2.version>2.1.1</commons-dbcp2.version> 
    <mysql-connector-java.version>5.1.36</mysql-connector-java.version> 
    <junit.version>4.12</junit.version> 
</properties> 

<dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>${junit.version}</version> 
     <scope>test</scope> 
    </dependency> 

    <!-- Spring --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>${org.springframework.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-jdbc</artifactId> 
     <version>${org.springframework.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>javax.inject</groupId> 
     <artifactId>javax.inject</artifactId> 
     <version>1</version> 
     <scope>compile</scope> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-tx</artifactId> 
     <version>${org.springframework-version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-orm</artifactId> 
     <version>${org.springframework-version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>${hibernate-entitymanager.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>${mysql-connector-java.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.commons</groupId> 
     <artifactId>commons-dbcp2</artifactId> 
     <version>${commons-dbcp2.version}</version> 
    </dependency> 
</dependencies> 

<build> 
    <finalName>${project.artifactId}</finalName> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.3</version> 
      <configuration> 
       <source>${java-version}</source> 
       <target>${java-version}</target> 
       <compilerArgument>-Xlint:all</compilerArgument> 
       <showWarnings>true</showWarnings> 
       <showDeprecation>true</showDeprecation> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

Надеется, что это помогает , Спасибо

+1

Спасибо, Basti мне очень помогло –

+0

Мое удовольствие :) Вы также можете использовать Spring Data JPA в своем проекте. Таким образом, вам не нужно писать простые запросы в своих классах домена. Также это упростит ваше приложение еще больше. Следуйте по этой ссылке https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods – Basit

+0

Это здорово - наконец-то есть документация о том, как это сделать! Только один вопрос, который я сейчас рассмотрю, ясно, как это сделать: как вы его кодируете без какой-либо жестко закодированной зависимости от классов драйвера JDBC и классов пула соединений? – Adam