#69 - Added example for how to set up Spring Data JPA with two DataSources.
This commit is contained in:
7
jpa/multiple-datasources/README.md
Normal file
7
jpa/multiple-datasources/README.md
Normal file
@@ -0,0 +1,7 @@
|
||||
# Spring Data JPA - Multiple datasources example
|
||||
|
||||
This project contains an example of how to set up Spring Data to work with two independent databases. Note, that this example is not about JTA transactions spanning multiple databases but rather just interacting with separate databases through a cleanly separated domain model and Spring Data repositories.
|
||||
|
||||
## Interesting points to look at
|
||||
|
||||
Two connect to two databases we need to manually configure a `DataSource`, `EntityManagerFactory` and `JpaTransactionManager`. This is done in `CustomerConfig` and `OrderConfig`. `DataInitializer` then simulates a Spring component interacting with those databases in separate methods. `Application.init()` orchestrates calls to those methods.
|
||||
14
jpa/multiple-datasources/pom.xml
Normal file
14
jpa/multiple-datasources/pom.xml
Normal file
@@ -0,0 +1,14 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<parent>
|
||||
<groupId>org.springframework.data.examples</groupId>
|
||||
<artifactId>spring-data-jpa-examples</artifactId>
|
||||
<version>1.0.0.BUILD-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>spring-data-jpa-multiple-datasources</artifactId>
|
||||
<name>Spring Data JPA - Multple datasources</name>
|
||||
|
||||
</project>
|
||||
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
* Copyright 2015 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package example.springdata.jpa.multipleds;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
|
||||
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
||||
|
||||
import example.springdata.jpa.multipleds.customer.Customer.CustomerId;
|
||||
|
||||
/**
|
||||
* Core Spring Boot application configuration. Note, that we explicitly deactivate some auto-configurations explicitly.
|
||||
* They mostly will even disable automatically if special bean names are used (e.g. {@code entityManagerFactory}) but I
|
||||
* wanted to keep the two configurations symmetric. The configuration classes being located in separate packages serves
|
||||
* the purpose of scoping the Spring Data repository scanning to those packages so that the infrastructure setup is
|
||||
* attached to the corresponding repository instances.
|
||||
*
|
||||
* @author Oliver Gierke
|
||||
* @see example.springdata.jpa.multipleds.customer.CustomerConfig
|
||||
* @see example.springdata.jpa.multipleds.order.OrderConfig
|
||||
*/
|
||||
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class,
|
||||
DataSourceTransactionManagerAutoConfiguration.class })
|
||||
@EnableTransactionManagement
|
||||
public class Application {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(Application.class, args);
|
||||
}
|
||||
|
||||
@Autowired DataInitializer initializer;
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
|
||||
CustomerId customerId = initializer.initializeCustomer();
|
||||
initializer.initializeOrder(customerId);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
/*
|
||||
* Copyright 2015 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package example.springdata.jpa.multipleds;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
|
||||
import lombok.NonNull;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
import example.springdata.jpa.multipleds.customer.Customer;
|
||||
import example.springdata.jpa.multipleds.customer.Customer.CustomerId;
|
||||
import example.springdata.jpa.multipleds.customer.CustomerRepository;
|
||||
import example.springdata.jpa.multipleds.order.Order;
|
||||
import example.springdata.jpa.multipleds.order.Order.LineItem;
|
||||
import example.springdata.jpa.multipleds.order.OrderRepository;
|
||||
|
||||
/**
|
||||
* Sample component to demonstrate how to work with repositories backed by different {@link DataSource}s. Note how we
|
||||
* explicitly select a transaction manager by name. In this particular case (only one operation on the repository) this
|
||||
* is not strictly necessary. However, if multiple repositories or multiple interactions on the very same repsoitory are
|
||||
* to be executed in a method we need to expand the transaction boundary around these interactions. It's recommended to
|
||||
* create a dedicated annotation meta-annotated with {@code @Transactional("…")} to be able to refer to a particular
|
||||
* datasource without using String qualifiers.
|
||||
* <p>
|
||||
* Also, not that one cannot interact with both databases in a single, transactional method as transactions are thread
|
||||
* bound in Spring an thus only a single transaction can be active in a single thread. See {@link Application#init()}
|
||||
* for how to orchestrate the calls.
|
||||
*
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
@Component
|
||||
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
|
||||
public class DataInitializer {
|
||||
|
||||
private final @NonNull OrderRepository orders;
|
||||
private final @NonNull CustomerRepository customers;
|
||||
|
||||
/**
|
||||
* Initializes a {@link Customer}.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Transactional("customerTransactionManager")
|
||||
public CustomerId initializeCustomer() {
|
||||
return customers.save(new Customer("Dave", "Matthews")).getId();
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes an {@link Order}.
|
||||
*
|
||||
* @param customer must not be {@literal null}.
|
||||
* @return
|
||||
*/
|
||||
@Transactional("orderTransactionManager")
|
||||
public Order initializeOrder(CustomerId customer) {
|
||||
|
||||
Assert.notNull(customer, "Custoemr identifier must not be null!");
|
||||
|
||||
Order order = new Order(customer);
|
||||
order.add(new LineItem("Lakewood Guitar"));
|
||||
|
||||
return orders.save(order);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
/*
|
||||
* Copyright 2015 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package example.springdata.jpa.multipleds.customer;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import javax.persistence.Embeddable;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.GeneratedValue;
|
||||
import javax.persistence.Id;
|
||||
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.ToString;
|
||||
import lombok.Value;
|
||||
|
||||
/**
|
||||
* Simple domain class representing a {@link Customer}.
|
||||
*
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
@Entity
|
||||
@EqualsAndHashCode(of = "id")
|
||||
@Getter
|
||||
@RequiredArgsConstructor
|
||||
@ToString
|
||||
public class Customer {
|
||||
|
||||
private @Id @GeneratedValue Long id;
|
||||
private final String firstname, lastname;
|
||||
|
||||
Customer() {
|
||||
this.firstname = null;
|
||||
this.lastname = null;
|
||||
}
|
||||
|
||||
public CustomerId getId() {
|
||||
return new CustomerId(id);
|
||||
}
|
||||
|
||||
@Value
|
||||
@Embeddable
|
||||
@RequiredArgsConstructor
|
||||
@SuppressWarnings("serial")
|
||||
public static class CustomerId implements Serializable {
|
||||
|
||||
private final Long customerId;
|
||||
|
||||
CustomerId() {
|
||||
this.customerId = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
/*
|
||||
* Copyright 2015 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package example.springdata.jpa.multipleds.customer;
|
||||
|
||||
import javax.persistence.EntityManagerFactory;
|
||||
import javax.sql.DataSource;
|
||||
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
|
||||
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
|
||||
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
|
||||
import org.springframework.orm.jpa.JpaTransactionManager;
|
||||
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
|
||||
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
|
||||
import org.springframework.transaction.PlatformTransactionManager;
|
||||
|
||||
/**
|
||||
* Configuration for the {@link Customer} slice of the system. A dedicated {@link DataSource},
|
||||
* {@link JpaTransactionManager} and {@link EntityManagerFactory}. Note that there could of course be some deduplication
|
||||
* with {@link example.springdata.jpa.multipleds.order.OrderConfig}. I just decided to keep it to focus on the
|
||||
* sepeartion of the two. Also, some overlaps might not even occur in real world scenarios (whether to create DDl or the
|
||||
* like).
|
||||
*
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
@Configuration
|
||||
@EnableJpaRepositories(entityManagerFactoryRef = "customerEntityManagerFactory",
|
||||
transactionManagerRef = "customerTransactionManager")
|
||||
class CustomerConfig {
|
||||
|
||||
@Bean
|
||||
PlatformTransactionManager customerTransactionManager() {
|
||||
return new JpaTransactionManager(customerEntityManagerFactory().getObject());
|
||||
}
|
||||
|
||||
@Bean
|
||||
LocalContainerEntityManagerFactoryBean customerEntityManagerFactory() {
|
||||
|
||||
HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
|
||||
jpaVendorAdapter.setGenerateDdl(true);
|
||||
|
||||
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
|
||||
|
||||
factoryBean.setDataSource(customerDataSource());
|
||||
factoryBean.setJpaVendorAdapter(jpaVendorAdapter);
|
||||
factoryBean.setPackagesToScan(CustomerConfig.class.getPackage().getName());
|
||||
|
||||
return factoryBean;
|
||||
}
|
||||
|
||||
@Bean
|
||||
DataSource customerDataSource() {
|
||||
|
||||
return new EmbeddedDatabaseBuilder().//
|
||||
setType(EmbeddedDatabaseType.HSQL).//
|
||||
setName("customers").//
|
||||
build();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Copyright 2015 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package example.springdata.jpa.multipleds.customer;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
|
||||
/**
|
||||
* Spring Data repository to manage {@link Customer}s.
|
||||
*
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
public interface CustomerRepository extends CrudRepository<Customer, Long> {
|
||||
|
||||
Optional<Customer> findByLastname(String lastname);
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
/*
|
||||
* Copyright 2015 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package example.springdata.jpa.multipleds.order;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.persistence.CascadeType;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.GeneratedValue;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.OneToMany;
|
||||
import javax.persistence.Table;
|
||||
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.ToString;
|
||||
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
import example.springdata.jpa.multipleds.customer.Customer.CustomerId;
|
||||
|
||||
/**
|
||||
* Simple domain class representing an {@link Order}
|
||||
*
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
@Entity
|
||||
@EqualsAndHashCode(of = "id")
|
||||
@Getter
|
||||
@RequiredArgsConstructor
|
||||
@ToString
|
||||
// Needs to be explicitly named as Order is a reserved keyword
|
||||
@Table(name = "SampleOrder")
|
||||
public class Order {
|
||||
|
||||
private @Id @GeneratedValue Long id;
|
||||
|
||||
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)//
|
||||
private final List<LineItem> lineItems = new ArrayList<LineItem>();
|
||||
private final CustomerId customer;
|
||||
|
||||
Order() {
|
||||
this.customer = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a {@link LineItem} to the {@link Order}.
|
||||
*
|
||||
* @param lineItem must not be {@literal null}.
|
||||
*/
|
||||
public void add(LineItem lineItem) {
|
||||
|
||||
Assert.notNull(lineItem, "Line item must not be null!");
|
||||
|
||||
this.lineItems.add(lineItem);
|
||||
}
|
||||
|
||||
@Entity
|
||||
@EqualsAndHashCode(of = "id")
|
||||
@Getter
|
||||
@RequiredArgsConstructor
|
||||
@ToString
|
||||
@Table(name = "LineItem")
|
||||
public static class LineItem {
|
||||
|
||||
private @Id @GeneratedValue Long id;
|
||||
private final String description;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
/*
|
||||
* Copyright 2015 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package example.springdata.jpa.multipleds.order;
|
||||
|
||||
import javax.persistence.EntityManagerFactory;
|
||||
import javax.sql.DataSource;
|
||||
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
|
||||
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
|
||||
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
|
||||
import org.springframework.orm.jpa.JpaTransactionManager;
|
||||
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
|
||||
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
|
||||
import org.springframework.transaction.PlatformTransactionManager;
|
||||
|
||||
/**
|
||||
* Configuration for the {@link Order} slice of the system. A dedicated {@link DataSource},
|
||||
* {@link JpaTransactionManager} and {@link EntityManagerFactory}. Note that there could of course be some deduplication
|
||||
* with {@link example.springdata.jpa.multipleds.customer.CustomerConfig}. I just decided to keep it to focus on the
|
||||
* sepeartion of the two. Also, some overlaps might not even occur in real world scenarios (whether to create DDl or the
|
||||
* like).
|
||||
*
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
@Configuration
|
||||
@EnableJpaRepositories(entityManagerFactoryRef = "orderEntityManagerFactory",
|
||||
transactionManagerRef = "orderTransactionManager")
|
||||
class OrderConfig {
|
||||
|
||||
@Bean
|
||||
PlatformTransactionManager orderTransactionManager() {
|
||||
return new JpaTransactionManager(orderEntityManagerFactory().getObject());
|
||||
}
|
||||
|
||||
@Bean
|
||||
LocalContainerEntityManagerFactoryBean orderEntityManagerFactory() {
|
||||
|
||||
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
|
||||
vendorAdapter.setGenerateDdl(true);
|
||||
|
||||
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
|
||||
|
||||
factoryBean.setDataSource(orderDataSource());
|
||||
factoryBean.setJpaVendorAdapter(vendorAdapter);
|
||||
factoryBean.setPackagesToScan(OrderConfig.class.getPackage().getName());
|
||||
|
||||
return factoryBean;
|
||||
}
|
||||
|
||||
@Bean
|
||||
DataSource orderDataSource() {
|
||||
|
||||
return new EmbeddedDatabaseBuilder().//
|
||||
setType(EmbeddedDatabaseType.HSQL).//
|
||||
setName("orders").//
|
||||
build();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Copyright 2015 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package example.springdata.jpa.multipleds.order;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
|
||||
import example.springdata.jpa.multipleds.customer.Customer;
|
||||
import example.springdata.jpa.multipleds.customer.Customer.CustomerId;
|
||||
|
||||
/**
|
||||
* Spring Data repository managing {@link Order}s.
|
||||
*
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
public interface OrderRepository extends CrudRepository<Order, Long> {
|
||||
|
||||
/**
|
||||
* Returns all {@link Order}s for the {@link Customer} with the given identifier.
|
||||
*
|
||||
* @param id must not be {@literal null}.
|
||||
* @return
|
||||
*/
|
||||
List<Order> findByCustomer(CustomerId id);
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
* Copyright 2015 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package example.springdata.jpa.multipleds.customer;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.*;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
import javax.transaction.Transactional;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.boot.test.SpringApplicationConfiguration;
|
||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
import org.springframework.test.context.transaction.TransactionConfiguration;
|
||||
|
||||
import example.springdata.jpa.multipleds.Application;
|
||||
|
||||
/**
|
||||
* Integration test for {@link CustomerRepository}.
|
||||
*
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
@RunWith(SpringJUnit4ClassRunner.class)
|
||||
@SpringApplicationConfiguration(classes = Application.class)
|
||||
@Transactional
|
||||
@TransactionConfiguration(transactionManager = "customerTransactionManager")
|
||||
public class CustomerRepositoryTests {
|
||||
|
||||
@Autowired CustomerRepository repository;
|
||||
@Autowired @Qualifier("customerEntityManagerFactory") EntityManager em;
|
||||
|
||||
@Test
|
||||
public void findsCustomerByLastname() {
|
||||
|
||||
Optional<Customer> result = repository.findByLastname("Matthews");
|
||||
|
||||
assertThat(result, is(not(Optional.empty())));
|
||||
assertThat(result.get().getFirstname(), is("Dave"));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
* Copyright 2015 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package example.springdata.jpa.multipleds.order;
|
||||
|
||||
import static org.hamcrest.Matchers.*;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import javax.transaction.Transactional;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.SpringApplicationConfiguration;
|
||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
import org.springframework.test.context.transaction.TransactionConfiguration;
|
||||
|
||||
import example.springdata.jpa.multipleds.Application;
|
||||
import example.springdata.jpa.multipleds.customer.CustomerRepository;
|
||||
|
||||
/**
|
||||
* Integration test for {@link CustomerRepository}.
|
||||
*
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
@RunWith(SpringJUnit4ClassRunner.class)
|
||||
@SpringApplicationConfiguration(classes = Application.class)
|
||||
@Transactional
|
||||
@TransactionConfiguration(transactionManager = "orderTransactionManager")
|
||||
public class OrderRepositoryTests {
|
||||
|
||||
@Autowired OrderRepository orders;
|
||||
@Autowired CustomerRepository customers;
|
||||
|
||||
@Test
|
||||
public void persistsAndFindsCustomer() {
|
||||
|
||||
customers.findAll().forEach(customer -> {
|
||||
assertThat(orders.findByCustomer(customer.getId()), hasSize(1));
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -23,6 +23,7 @@
|
||||
<module>java8</module>
|
||||
<module>jpa21</module>
|
||||
<module>security</module>
|
||||
<module>multiple-datasources</module>
|
||||
</modules>
|
||||
|
||||
<dependencies>
|
||||
|
||||
Reference in New Issue
Block a user