Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Spring Data JPAによるデータアクセス徹底入門 #jsug

8,344 views

Published on

JSUG Spring Fest 2017での発表資料です。

Published in: Technology
  • Be the first to comment

Spring Data JPAによるデータアクセス徹底入門 #jsug

  1. 1. (C) CASAREAL, Inc. All rights reserved. 1
  2. 2. (C) CASAREAL, Inc. All rights reserved. 2
  3. 3. (C) CASAREAL, Inc. All rights reserved. 3
  4. 4. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ 😅 ▸ ▸ 4
  5. 5. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ ▸ ▸ 5
  6. 6. (C) CASAREAL, Inc. All rights reserved. ▸ 6
  7. 7. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ ▸ ▸ ▸ 7
  8. 8. (C) CASAREAL, Inc. All rights reserved. 8 Spring Web 4 Spring MVC Spring Boot Developer 2 Spring Boot Spring Cloud Services 3 Spring Cloud Microservices
  9. 9. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ ▸ 9
  10. 10. (C) CASAREAL, Inc. All rights reserved. 10
  11. 11. (C) CASAREAL, Inc. All rights reserved. 11
  12. 12. (C) CASAREAL, Inc. All rights reserved. ▸ 12
  13. 13. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ ▸ ▸ 13
  14. 14. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ 14
  15. 15. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ ▸ 15 ※ JPA 2.1(Java EE 7) 

  16. 16. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ ▸ 16
  17. 17. (C) CASAREAL, Inc. All rights reserved. ▸ 17 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
  18. 18. (C) CASAREAL, Inc. All rights reserved. ▸ 18 <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>2.0.1.RELEASE</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>5.2.12.Final</version> </dependency>
  19. 19. (C) CASAREAL, Inc. All rights reserved. ▸ 19 logging.level.org.hibernate.SQL=debug logging.level.org.hibernate.type.descriptor.sql.BasicBinder= trace <logger name="org.hibernate.SQL" level="DEBUG" /> <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" /> ▸ ▸ ※hibernate.show_sql=true
  20. 20. (C) CASAREAL, Inc. All rights reserved. ▸ 20 spring.jpa.properties.hibernate.format_sql=true ▸ ▸ ▸
  21. 21. (C) CASAREAL, Inc. All rights reserved. 21
  22. 22. (C) CASAREAL, Inc. All rights reserved. 22 
 DB
  23. 23. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ 23 @Entity public class Product { @Id private Integer id; private String name; // setter/getter }
  24. 24. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ ▸ 
 24
  25. 25. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ 
 25
  26. 26. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ 
 26
  27. 27. (C) CASAREAL, Inc. All rights reserved. 27 NEW new MANAGED DETACHED REMOVED
  28. 28. (C) CASAREAL, Inc. All rights reserved. 28 find() persist() 1 remove() 1 merge() detach() flush() DB clear() refresh() DB
  29. 29. (C) CASAREAL, Inc. All rights reserved. 29 persist() detach()
 clear() merge() remove() flush() flush() refresh() find()
 JPQL detach()
 clear()
  30. 30. (C) CASAREAL, Inc. All rights reserved. 30 EntityManager em = …; // 1 2 Product product = em.find(Product.class, 1); ▸ select product0_.id as id1_5_0_, product0_.category_id as category4_5_0_, product0_.name as name2_5_0_, product0_.price as price3_5_0_, product0_.vendor_id as vendor_i5_5_0_ from product product0_ where product0_.id=? SQL 

  31. 31. (C) CASAREAL, Inc. All rights reserved. 31 Product product = new Product(“ ”, 100000L); em.persist(product); ▸ ▸ insert into product (category_id, name, price, vendor_id, id) values (?, ?, ?, ?, ?)
  32. 32. (C) CASAREAL, Inc. All rights reserved. 32 // find() MANAGED Product product = em.find(Product.class, 1); // product.setName(" "); // ( OK) em.flush(); ▸
  33. 33. (C) CASAREAL, Inc. All rights reserved. 33 select … from product product0_ where product0_.id=? binding parameter [1] as [INTEGER] - [1] update product set category_id=?, name=?, price=?, vendor_id=? where id=? binding parameter [1] as [INTEGER] - [1] binding parameter [2] as [VARCHAR] - [ ] binding parameter [3] as [BIGINT] - [100000] binding parameter [4] as [INTEGER] - [1] binding parameter [5] as [INTEGER] - [1]
  34. 34. (C) CASAREAL, Inc. All rights reserved. 34 Product product = new Product(); product.setId(1); product.setName(“ "); // merge() em.merge(product); em.flush(); ▸
  35. 35. (C) CASAREAL, Inc. All rights reserved. 35 select … from product product0_ where product0_.id=? binding parameter [1] as [INTEGER] - [1] update product set category_id=?, name=?, price=?, vendor_id=? where id=? binding parameter [1] as [INTEGER] - [null] binding parameter [2] as [VARCHAR] - [ ] binding parameter [3] as [BIGINT] - [null] binding parameter [4] as [INTEGER] - [null] binding parameter [5] as [INTEGER] - [1] ▸
  36. 36. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ 36 Product mergedProduct = em.merge(product); // MANAGED assertTrue(em.contains(mergedProduct)); // assertFalse(em.contains(product));
  37. 37. (C) CASAREAL, Inc. All rights reserved. 37 // find() MANAGED Product product = em.find(Product.class, 30); // REMOVED em.remove(product); // ( OK) em.flush(); ▸
  38. 38. (C) CASAREAL, Inc. All rights reserved. 38 select … from product product0_ where product0_.id=? binding parameter [1] as [INTEGER] - [30] delete from product where id=? binding parameter [1] as [INTEGER] - [30]
  39. 39. (C) CASAREAL, Inc. All rights reserved. 39 // find() MANAGED Product product = em.find(Product.class, 30); // REMOVED em.remove(product); // DETACHED em.detach(product); // DETACHED DB em.flush(); ▸
  40. 40. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ ▸ ▸ 40
  41. 41. (C) CASAREAL, Inc. All rights reserved. 41
  42. 42. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ ▸ 42
  43. 43. (C) CASAREAL, Inc. All rights reserved. 43 TypedQuery<Product> query = em.createQuery( "SELECT p FROM Product p WHERE p.id = :id", Product.class); query.setParameter("id", 1); Product product = query.getSingleResult(); TypedQuery<Product> query = em.createQuery( "SELECT p FROM Product p WHERE p.id <= :maxId" + " ORDER BY p.id", Product.class); query.setParameter("maxId", 5); List<Product> list = query.getResultList(); ▸ ▸
  44. 44. (C) CASAREAL, Inc. All rights reserved. 44 select product0_.id as id1_5_, product0_.category_id as category4_5_, product0_.name as name2_5_, product0_.price as price3_5_, product0_.vendor_id as vendor_i5_5_ from product product0_ where product0_.id=? ▸ 

  45. 45. (C) CASAREAL, Inc. All rights reserved. 45 SELECT FROM [AS] WHERE . <= : ▸ ▸ 
 ▸
  46. 46. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ 46 SELECT new com.example.demo.dto.CountDto( od.product.id, COUNT(od)) FROM OrderDetail od GROUP BY od.product.id
  47. 47. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ ▸ ▸ 47
  48. 48. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ ▸ 48
  49. 49. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ 49
  50. 50. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ 50
  51. 51. (C) CASAREAL, Inc. All rights reserved. 51
  52. 52. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ ▸ 52 @Entity public class Product { … @ManyToOne @JoinColumn(name="vendor_id") private Vendor vendor; } @Entity public class Vendor { … }
  53. 53. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ 53
  54. 54. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ 54 @Entity public class Product { … @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="vendor_id") private Vendor vendor; }
  55. 55. (C) CASAREAL, Inc. All rights reserved. 55 select ( ) from product product0_ where product0_.id=? select ( ) from vendor vendor0_ where vendor0_.id=? @Entity public class Product { @ManyToOne(fetch = FetchType.LAZY) private Vendor vendor; } Product p = em.find(Product.class, 1); Vendor v = p.getVendor(); String n = v.getName() // SELECT 2 SELECT
  56. 56. (C) CASAREAL, Inc. All rights reserved. ▸ 56 em.getTransaction().begin(); Product p = em.find(Product.class, 1); em.getTransaction().rollback(); Vendor v = p.getVendor(); String n = v.getName(); //
  57. 57. (C) CASAREAL, Inc. All rights reserved. 57 @Entity public class Product { @ManyToOne(fetch = FetchType.EAGER) private Vendor vendor; } Product p = em.find(Product.class, 1); Vendor v = p.getVendor(); // select ( ) from product product0_ left outer join vendor vendor2_ on product0_.vendor_id=vendor2_.id where product0_.id=? 1 SELECT
  58. 58. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ 
 ▸ 58
  59. 59. (C) CASAREAL, Inc. All rights reserved. 59 // order_summary SELECT 1 List<OrderSummary> list = em.createQuery( "SELECT os FROM OrderSummary os",OrderSummary.class) .getResultList(); for (OrderSummary os : list) { // order_detail System.out.println(os); for (OrderDetail od : os.getOrderDetailList()) { // order_detail SELECT (N ) System.out.println(od); } }
  60. 60. (C) CASAREAL, Inc. All rights reserved. 60 // order_summary SELECT 1 List<OrderSummary> list = em.createQuery( "SELECT os FROM OrderSummary os" + " JOIN os.orderDetailList", OrderSummary.class) .getResultList(); for (OrderSummary os : list) { // order_detail System.out.println(os); for (OrderDetail od : os.getOrderDetailList()) { // order_detail SELECT (N ) System.out.println(od); } }
  61. 61. (C) CASAREAL, Inc. All rights reserved. 61 select ordersumma0_.id as id1_3_, ordersumma0_.customer_id as customer3_3_, ordersumma0_.order_timestamp as order_ti2_3_ from order_summary ordersumma0_ inner join order_detail orderdetai1_ on ordersumma0_.id=orderdetai1_.summary_id where ordersumma0_.id=? JOIN 
 order_summary 

  62. 62. (C) CASAREAL, Inc. All rights reserved. ▸ 62 // order_summary SELECT 1 List<OrderSummary> list = em.createQuery( "SELECT os FROM OrderSummary os" + " JOIN FETCH os.orderDetailList" + , OrderSummary.class) .getResultList();
  63. 63. (C) CASAREAL, Inc. All rights reserved. 63 select ordersumma0_.id as id1_3_0_, orderdetai1_.id as id1_2_1_, ordersumma0_.customer_id as customer3_3_0_, ordersumma0_.order_timestamp as order_ti2_3_0_, orderdetai1_.amount as amount2_2_1_, orderdetai1_.product_id as product_3_2_1_, orderdetai1_.summary_id as summary_4_2_0__, orderdetai1_.id as id1_2_0__ from order_summary ordersumma0_ inner join order_detail orderdetai1_ on ordersumma0_.id=orderdetai1_.summary_id where ordersumma0_.id=? JOIN 

  64. 64. (C) CASAREAL, Inc. All rights reserved. 64 OrderSummary{id=1, orderTimestamp=2017-04-01T10:00} OrderDetail{id=1, amount=2} OrderDetail{id=2, amount=2} OrderDetail{id=3, amount=2} OrderSummary{id=1, orderTimestamp=2017-04-01T10:00} OrderDetail{id=1, amount=2} OrderDetail{id=2, amount=2} OrderDetail{id=3, amount=2} OrderSummary{id=1, orderTimestamp=2017-04-01T10:00} OrderDetail{id=1, amount=2} OrderDetail{id=2, amount=2} OrderDetail{id=3, amount=2} OrderSummary{id=2, orderTimestamp=2017-04-01T10:00} OrderDetail{id=4, amount=2} OrderDetail{id=5, amount=2} 

  65. 65. (C) CASAREAL, Inc. All rights reserved. 65 // order_summary SELECT 1 List<OrderSummary> list = em.createQuery( "SELECT DISTINCT os FROM OrderSummary os" + " JOIN FETCH os.orderDetailList" + , OrderSummary.class) .getResultList();
  66. 66. (C) CASAREAL, Inc. All rights reserved. 66 select distinct ordersumma0_.id as id1_3_0_, orderdetai1_.id as id1_2_1_, ordersumma0_.customer_id as customer3_3_0_, ordersumma0_.order_timestamp as order_ti2_3_0_, orderdetai1_.amount as amount2_2_1_, orderdetai1_.product_id as product_3_2_1_, orderdetai1_.summary_id as summary_4_2_0__, orderdetai1_.id as id1_2_0__ from order_summary ordersumma0_ inner join order_detail orderdetai1_ on ordersumma0_.id=orderdetai1_.summary_id where ordersumma0_.id=? distinct 
 SQL 

  67. 67. (C) CASAREAL, Inc. All rights reserved. 67 OrderSummary{id=1, orderTimestamp=2017-04-01T10:00} OrderDetail{id=3, amount=2} OrderDetail{id=1, amount=2} OrderDetail{id=2, amount=2} OrderSummary{id=2, orderTimestamp=2017-04-01T10:00} OrderDetail{id=5, amount=2} OrderDetail{id=6, amount=2} OrderDetail{id=4, amount=2} OrderSummary{id=9, orderTimestamp=2017-04-01T10:00} OrderSummary{id=7, orderTimestamp=2017-04-01T10:00} OrderSummary{id=6, orderTimestamp=2017-04-01T10:00} OrderSummary{id=5, orderTimestamp=2017-04-01T10:00} OrderSummary{id=4, orderTimestamp=2017-04-01T10:00} OrderSummary{id=3, orderTimestamp=2017-04-01T10:00} OrderSummary{id=8, orderTimestamp=2017-04-01T10:00} OrderSummary{id=10, orderTimestamp=2017-04-01T10:00} 

  68. 68. (C) CASAREAL, Inc. All rights reserved. ▸ 68
  69. 69. (C) CASAREAL, Inc. All rights reserved. // order_summary order_detail product JOIN OrderSummary orderSummary = em.createQuery( "SELECT os FROM OrderSummary os" + " JOIN FETCH os.orderDetailList od" + " JOIN FETCH od.product p" + " WHERE os.id = :id", OrderSummary.class) .setParameter("id", 1) .getSingleResult(); ▸ 69
  70. 70. (C) CASAREAL, Inc. All rights reserved. 70 select ordersumma0_.id as id1_3_0_, orderdetai1_.id as id1_2_1_, product2_.id as id1_4_2_, ordersumma0_.customer_id as customer3_3_0_, ordersumma0_.order_timestamp as order_ti2_3_0_, orderdetai1_.amount as amount2_2_1_, orderdetai1_.product_id as product_3_2_1_, orderdetai1_.summary_id as summary_4_2_0__, orderdetai1_.id as id1_2_0__, product2_.category_id as category4_4_2_, product2_.name as name2_4_2_, product2_.price as price3_4_2_, product2_.vendor_id as vendor_i5_4_2_ from order_summary ordersumma0_ inner join order_detail orderdetai1_ on ordersumma0_.id=orderdetai1_.summary_id inner join product product2_ on orderdetai1_.product_id=product2_.id where ordersumma0_.id=? 3 
 JOIN 

  71. 71. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ 71
  72. 72. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ 
 ▸ ▸ 72 https://www.casareal.co.jp/recruit/jobs/ ls_teacher.php
  73. 73. (C) CASAREAL, Inc. All rights reserved. ▸ 
 ✕ 
 ✕ ▸ 
 
 
 
 73 https://www.casareal.co.jp/ls/service/shinjinseminar/course01
  74. 74. (C) CASAREAL, Inc. All rights reserved. 74
  75. 75. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ ▸ 75
  76. 76. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ 76 Query query = em.createNativeQuery( "select id, name, price, vendor_id" + " from product where id = :id", Product.class); query.setParameter("id", 1); Product product = (Product) query.getSingleResult();
  77. 77. (C) CASAREAL, Inc. All rights reserved. ▸ 77 Query query = em.createNativeQuery( "select id, name from product where id = :id"); query.setParameter("id", 1); // 0 id 1 name Object[] objs = (Object[]) query.getSingleResult(); Integer productId = (Integer) objs[0]; String productName = (String) objs[1];
  78. 78. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ 78
  79. 79. (C) CASAREAL, Inc. All rights reserved. 79 @Entity @SqlResultSetMapping( name = "product_id_name", // classes = { @ConstructorResult(targetClass = ProductDto.class, columns = { @ColumnResult(name = "id"), @ColumnResult(name = "name") } ) } ) public class Product { … } 
 ※@SqlResultSetMappings @SqlResultSetMapping
  80. 80. (C) CASAREAL, Inc. All rights reserved. 80 Query query = em.createNativeQuery( "select id, name from product where id = :id", "product_id_name"); // @SqlResultSetMapping name query.setParameter("id", 1); ProductDto productDto = (ProductDto) query.getSingleResult(); public class ProductDto { private Integer id; private String name; public ProductDto(Integer id, String name) { … } } 

  81. 81. (C) CASAREAL, Inc. All rights reserved. ▸ 81 // H2 Database LEFT TypedQuery<Product> query = em.createQuery( "SELECT p FROM Product p" + " WHERE FUNCTION('LEFT', p.name, 2) = ' '", Product.class); List<Product> productList = query.getResultList();
  82. 82. (C) CASAREAL, Inc. All rights reserved. ▸ 82 StoredProcedureQuery query = em.createStoredProcedureQuery(" ", .class); query.setParameter(" ", ); List< > list = (List< >) query.getResultList(); ※
  83. 83. (C) CASAREAL, Inc. All rights reserved. ▸ 83 @Entity @Index(members = {"name"}) public class Product { … } ※ 
 ※@Indices @Index
  84. 84. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ 84
  85. 85. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ 85
  86. 86. (C) CASAREAL, Inc. All rights reserved. 86
  87. 87. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ ▸ ▸ 87
  88. 88. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ ▸ ▸ 88
  89. 89. (C) CASAREAL, Inc. All rights reserved. ▸ 89 public interface ProductRepository extends JpaRepository<Product, Integer> { // OK } ※@Repository
  90. 90. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ ▸ 90
  91. 91. (C) CASAREAL, Inc. All rights reserved. 91 @Service public class ProductService { private final ProductRepository repo; @Autowired // DI public ProductService(ProductRepository repo) { this.repo = repo; } @Transactional public void insert(Product product) { repo.save(product); } } ※@Autowired Spring 4.3 
 1
  92. 92. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ 92 public interface ProductRepository extends JpaRepository<Product, Integer> { @Query("SELECT p FROM Product p JOIN FETCH p.vendor" + " WHERE p.id = :id") Product findByIdJoinFetch(@Param("id") Integer id); }
  93. 93. (C) CASAREAL, Inc. All rights reserved. ▸ 93 public interface ProductRepository extends JpaRepository<Product, Integer> { @Modifying @Query("UPDATE Product p SET p.name = :name" + " WHERE p.id = :id") void updateName(@Param("name") String name, @Param("id") Integer id); }
  94. 94. (C) CASAREAL, Inc. All rights reserved. ▸ 94 public interface ProductRepository extends JpaRepository<Product, Integer> { @Lock(LockModeType.PESSIMISTIC_READ) @Query("SELECT p FROM Product p JOIN FETCH p.vendor" + " WHERE p.id = :id") Product findByIdJoinFetch(@Param("id") Integer id); } ※ 
 https://www.slideshare.net/masatoshitada7/jpa20140518-ccc-r15-jjug-ccc
  95. 95. (C) CASAREAL, Inc. All rights reserved. ▸ 95 public interface ProductRepository extends JpaRepository<Product, Integer> { @EntityGraph(" ") @Query("SELECT p FROM Product p JOIN FETCH p.vendor" + " WHERE p.id = :id") Product findByIdJoinFetch(@Param("id") Integer id); } ※ 
 https://blog.ik.am/entries/350
  96. 96. (C) CASAREAL, Inc. All rights reserved. ▸ 96 public interface ProductRepository extends JpaRepository<Product, Integer> { // name List<Product> findByNameContaining(String keyword); }
  97. 97. (C) CASAREAL, Inc. All rights reserved. 97 select product0_.id as id1_4_, product0_.category_id as category4_4_, product0_.name as name2_4_, product0_.price as price3_4_, product0_.vendor_id as vendor_i5_4_ from product product0_ where product0_.name like ? binding parameter [1] as [VARCHAR] - [% %]
  98. 98. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ 98
  99. 99. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ 99 

  100. 100. (C) CASAREAL, Inc. All rights reserved. ▸ 100 @Entity public class Hoge { @CreatedBy String createdUser; @CreatedDate LocalDateTime createdDate; @LastModifiedBy String modifiedUser; @LastModifiedDate LocalDateTime lastModifiedDate; }
  101. 101. (C) CASAREAL, Inc. All rights reserved. 101 @SpringBootApplication @EnableJpaAuditing(auditorAwareRef = "myAuditorAware") public class SpringDataJpaDaitokaiApplication { … } @Component public class MyAuditorAware implements AuditorAware<String> { @Override public Optional<String> getCurrentAuditor() { return Optional.of("user01");} } Spring Security 
 OK
  102. 102. (C) CASAREAL, Inc. All rights reserved. 102 <entity-mappings> <persistence-unit-metadata> <persistence-unit-defaults> <entity-listeners> <entity-listener class="org.springframework.data.jpa.domain.support.AuditingEntityListene r" /> </entity-listeners> </persistence-unit-defaults> </persistence-unit-metadata> </entity-mappings> ▸ ▸
  103. 103. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ ▸ 103
  104. 104. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ 104
  105. 105. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ ▸ ▸ ▸ 105
  106. 106. (C) CASAREAL, Inc. All rights reserved. 106
  107. 107. (C) CASAREAL, Inc. All rights reserved. ▸ 107 http://docs.spring.io/spring-boot/docs/1.5.4.RELEASE/reference/htmlsingle/#boot-features-jpa-in- web-environment
  108. 108. (C) CASAREAL, Inc. All rights reserved. ▸ 108 spring.jpa.open-in-view=false
  109. 109. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ 109 @Entity public class Hoge { // Spring Boot @Column @Column(name=“foo_bar”) String fooBar; } http://docs.spring.io/spring-boot/docs/1.5.4.RELEASE/reference/htmlsingle/#howto-configure- hibernate-naming-strategy
  110. 110. (C) CASAREAL, Inc. All rights reserved. ▸ 110 spring.jpa.hibernate.naming.physical-strategy=Strategy FQCN spring.jpa.hibernate.naming.implicit-strategy=Strategy FQCN
  111. 111. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ 111 @SpringBootApplication @EntityScan(basePackages = { "com.example.demo.persistence.entity", "org.springframework.data.jpa.convert.threeten"}) public class SpringDataJpaDaitokaiApplication { … } http://docs.spring.io/spring-boot/docs/1.5.4.RELEASE/reference/htmlsingle/#howto-separate-entity- definitions-from-spring-configuration
  112. 112. (C) CASAREAL, Inc. All rights reserved. 112
  113. 113. (C) CASAREAL, Inc. All rights reserved. ▸ 113
  114. 114. (C) CASAREAL, Inc. All rights reserved. 
 
 114 😅
  115. 115. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ ▸ ▸ ▸ 115
  116. 116. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ ▸ ▸ ▸ ▸ ▸ 116
  117. 117. (C) CASAREAL, Inc. All rights reserved. ▸ ▸ ▸ ▸ ▸ ▸ ▸ ▸ 117
  118. 118. (C) CASAREAL, Inc. All rights reserved. ▸ 118

×