{"id":40208,"date":"2023-05-20T08:31:37","date_gmt":"2023-04-26T07:15:33","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot%e5%92%8cspring-jpa%e6%9d%a5%e6%9f%a5%e8%af%a2%e5%85%b7%e6%9c%89%e5%a4%9a%e4%b8%aa%e5%88%97%e4%b8%bb%e9%94%ae%e7%9a%84%e8%a1%a8%e3%80%82\/"},"modified":"2024-04-30T05:02:33","modified_gmt":"2024-04-29T21:02:33","slug":"%e4%bd%bf%e7%94%a8springboot%e5%92%8cspring-jpa%e6%9d%a5%e6%9f%a5%e8%af%a2%e5%85%b7%e6%9c%89%e5%a4%9a%e4%b8%aa%e5%88%97%e4%b8%bb%e9%94%ae%e7%9a%84%e8%a1%a8%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot%e5%92%8cspring-jpa%e6%9d%a5%e6%9f%a5%e8%af%a2%e5%85%b7%e6%9c%89%e5%a4%9a%e4%b8%aa%e5%88%97%e4%b8%bb%e9%94%ae%e7%9a%84%e8%a1%a8%e3%80%82\/","title":{"rendered":"\u4f7f\u7528SpringBoot\u548cSpring JPA\u6765\u67e5\u8be2\u5177\u6709\u591a\u4e2a\u5217\u4e3b\u952e\u7684\u8868"},"content":{"rendered":"<h2>\u6211\u4eec\u5c06\u5c1d\u8bd5\u5728Spring-JPA\u4e2d\u5bf9\u5177\u6709\u591a\u4e2a\u5217\u4f5c\u4e3a\u4e3b\u952e\u7684\u8868\u8fdb\u884c\u641c\u7d22\u5904\u7406\u3002<\/h2>\n<p>1. \u5f62\u6210<\/p>\n<pre class=\"post-pre\"><code>sample-compositepk\r\n\u2502  build.gradle\r\n\u2514\u2500src\r\n    \u251c\u2500main\r\n        \u251c\u2500java\r\n        \u2502  \u2514\u2500com\r\n        \u2502      \u2514\u2500stone\r\n        \u2502          \u2514\u2500sample\r\n        \u2502                  SampleCompositePkApplication.java\r\n        \u2502                  SampleController.java\r\n        \u2502                  ServletInitializer.java\r\n        \u2502                  TCalendar.java\r\n        \u2502                  TCalendarPK.java\r\n        \u2502                  TCalendarRepository.java\r\n        \u2514\u2500resources\r\n            \u2502  application.properties\r\n            \u2502  hibernate.properties\r\n            \u2502  \r\n            \u251c\u2500static\r\n            \u2514\u2500templates\r\n                    index.html\r\n<\/code><\/pre>\n<p>2. \u4f9d\u8d56\u5173\u7cfb<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">dependencies<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"n\">compile<\/span><span class=\"o\">(<\/span><span class=\"s1\">'org.springframework.boot:spring-boot-starter-data-jpa'<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"n\">compile<\/span><span class=\"o\">(<\/span><span class=\"s1\">'org.springframework.boot:spring-boot-starter-thymeleaf'<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"n\">compile<\/span><span class=\"o\">(<\/span><span class=\"s1\">'org.springframework.boot:spring-boot-starter-web'<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"n\">runtime<\/span><span class=\"o\">(<\/span><span class=\"s1\">'org.springframework.boot:spring-boot-devtools'<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"n\">runtime<\/span><span class=\"o\">(<\/span><span class=\"s1\">'org.postgresql:postgresql'<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"n\">compileOnly<\/span><span class=\"o\">(<\/span><span class=\"s1\">'org.projectlombok:lombok'<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"n\">providedRuntime<\/span><span class=\"o\">(<\/span><span class=\"s1\">'org.springframework.boot:spring-boot-starter-tomcat'<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"n\">testCompile<\/span><span class=\"o\">(<\/span><span class=\"s1\">'org.springframework.boot:spring-boot-starter-test'<\/span><span class=\"o\">)<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>3. \u6570\u636e\u5e93\u8fde\u63a5\u914d\u7f6e<\/p>\n<pre class=\"post-pre\"><code><span class=\"py\">spring.datasource.driverClassName<\/span><span class=\"p\">=<\/span><span class=\"s\">org.postgresql.Driver<\/span>\r\n<span class=\"py\">spring.datasource.url<\/span><span class=\"p\">=<\/span><span class=\"s\">jdbc:postgresql:\/\/localhost:5432\/testdb<\/span>\r\n<span class=\"py\">spring.datasource.username<\/span><span class=\"p\">=<\/span><span class=\"s\">testuser<\/span>\r\n<span class=\"py\">spring.datasource.password<\/span><span class=\"p\">=<\/span><span class=\"s\">testuser<\/span>\r\n<span class=\"py\">spring.jpa.hibernate.ddl-auto<\/span><span class=\"p\">=<\/span><span class=\"s\">none<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"py\">hibernate.jdbc.lob.non_contextual_creation<\/span> <span class=\"p\">=<\/span> <span class=\"s\">true<\/span>\r\n<\/code><\/pre>\n<p>\u672c\u6b21\u6837\u672c\u4e2d\uff0c\u6211\u4eec\u5c06\u4f7f\u7528PostgreSQL\u4f5c\u4e3a\u6570\u636e\u5e93\u3002<\/p>\n<p>\u4e09\u7ef4\u6570\u636e\u5e93<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">create<\/span> <span class=\"k\">table<\/span> <span class=\"n\">tcalendar<\/span><span class=\"p\">(<\/span>\r\n <span class=\"n\">yyyymm<\/span> <span class=\"nb\">int<\/span> <span class=\"k\">not<\/span> <span class=\"k\">null<\/span>\r\n<span class=\"p\">,<\/span><span class=\"n\">dd<\/span> <span class=\"nb\">int<\/span> <span class=\"k\">not<\/span> <span class=\"k\">null<\/span>\r\n<span class=\"p\">,<\/span><span class=\"n\">plans<\/span> <span class=\"nb\">character<\/span> <span class=\"nb\">varying<\/span><span class=\"p\">(<\/span><span class=\"mi\">128<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">,<\/span><span class=\"k\">primary<\/span> <span class=\"k\">key<\/span><span class=\"p\">(<\/span><span class=\"n\">yyyymm<\/span><span class=\"p\">,<\/span><span class=\"n\">dd<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<p>\u4f5c\u4e3a\u793a\u4f8b\uff0c\u6211\u5c06\u521b\u5efa\u4e00\u4e2a\u65e5\u7a0b\u8868\u3002<br \/>\n\u4e3b\u952e\u4f7f\u7528\u5e74\u4efd\u548c\u65e5\u671f\u6307\u5b9a\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">insert<\/span> <span class=\"k\">into<\/span> <span class=\"k\">public<\/span><span class=\"p\">.<\/span><span class=\"n\">tcalendar<\/span> <span class=\"k\">values<\/span>\r\n<span class=\"p\">(<\/span><span class=\"mi\">201804<\/span><span class=\"p\">,<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span><span class=\"s1\">'1\u65e5\u76ee\u306e\u4e88\u5b9a'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">,(<\/span><span class=\"mi\">201804<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span><span class=\"s1\">'2\u65e5\u76ee\u306e\u4e88\u5b9a'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">,(<\/span><span class=\"mi\">201804<\/span><span class=\"p\">,<\/span><span class=\"mi\">3<\/span><span class=\"p\">,<\/span><span class=\"s1\">'3\u65e5\u76ee\u306e\u4e88\u5b9a'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">,(<\/span><span class=\"mi\">201804<\/span><span class=\"p\">,<\/span><span class=\"mi\">4<\/span><span class=\"p\">,<\/span><span class=\"s1\">'4\u65e5\u76ee\u306e\u4e88\u5b9a'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">,(<\/span><span class=\"mi\">201804<\/span><span class=\"p\">,<\/span><span class=\"mi\">5<\/span><span class=\"p\">,<\/span><span class=\"s1\">'5\u65e5\u76ee\u306e\u4e88\u5b9a'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">,(<\/span><span class=\"mi\">201804<\/span><span class=\"p\">,<\/span><span class=\"mi\">6<\/span><span class=\"p\">,<\/span><span class=\"s1\">'6\u65e5\u76ee\u306e\u4e88\u5b9a'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">,(<\/span><span class=\"mi\">201804<\/span><span class=\"p\">,<\/span><span class=\"mi\">7<\/span><span class=\"p\">,<\/span><span class=\"s1\">'7\u65e5\u76ee\u306e\u4e88\u5b9a'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">,(<\/span><span class=\"mi\">201804<\/span><span class=\"p\">,<\/span><span class=\"mi\">8<\/span><span class=\"p\">,<\/span><span class=\"s1\">'8\u65e5\u76ee\u306e\u4e88\u5b9a'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">,(<\/span><span class=\"mi\">201804<\/span><span class=\"p\">,<\/span><span class=\"mi\">9<\/span><span class=\"p\">,<\/span><span class=\"s1\">'9\u65e5\u76ee\u306e\u4e88\u5b9a'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">,(<\/span><span class=\"mi\">201804<\/span><span class=\"p\">,<\/span><span class=\"mi\">10<\/span><span class=\"p\">,<\/span><span class=\"s1\">'10\u65e5\u76ee\u306e\u4e88\u5b9a'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">,(<\/span><span class=\"mi\">201804<\/span><span class=\"p\">,<\/span><span class=\"mi\">11<\/span><span class=\"p\">,<\/span><span class=\"s1\">'11\u65e5\u76ee\u306e\u4e88\u5b9a'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">,(<\/span><span class=\"mi\">201804<\/span><span class=\"p\">,<\/span><span class=\"mi\">12<\/span><span class=\"p\">,<\/span><span class=\"s1\">'12\u65e5\u76ee\u306e\u4e88\u5b9a'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">,(<\/span><span class=\"mi\">201804<\/span><span class=\"p\">,<\/span><span class=\"mi\">13<\/span><span class=\"p\">,<\/span><span class=\"s1\">'13\u65e5\u76ee\u306e\u4e88\u5b9a'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">,(<\/span><span class=\"mi\">201804<\/span><span class=\"p\">,<\/span><span class=\"mi\">14<\/span><span class=\"p\">,<\/span><span class=\"s1\">'14\u65e5\u76ee\u306e\u4e88\u5b9a'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">,(<\/span><span class=\"mi\">201804<\/span><span class=\"p\">,<\/span><span class=\"mi\">15<\/span><span class=\"p\">,<\/span><span class=\"s1\">'15\u65e5\u76ee\u306e\u4e88\u5b9a'<\/span><span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<p>\u65e2\u7136\u51c6\u5907\u5de5\u4f5c\u5df2\u7ecf\u5b8c\u6210\uff0c\u63a5\u4e0b\u6765\u6211\u4eec\u8981\u5f00\u59cb\u521b\u5efa\u5e94\u7528\u7a0b\u5e8f\u3002<\/p>\n<p>4. \u5b9e\u4f53<\/p>\n<pre class=\"post-pre\"><code><span class=\"kn\">package<\/span> <span class=\"nn\">com.stone.sample<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">javax.persistence.Column<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">javax.persistence.Entity<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">javax.persistence.Id<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">javax.persistence.IdClass<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">javax.persistence.Table<\/span><span class=\"o\">;<\/span>\r\n<span class=\"nd\">@Entity<\/span>\r\n<span class=\"nd\">@Table<\/span><span class=\"o\">(<\/span><span class=\"n\">name<\/span><span class=\"o\">=<\/span><span class=\"s\">\"tcalendar\"<\/span><span class=\"o\">)<\/span>\r\n<span class=\"nd\">@IdClass<\/span><span class=\"o\">(<\/span><span class=\"nc\">TCalendarPK<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">)<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">TCalendar<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"cm\">\/**  *\/<\/span>\r\n    <span class=\"nd\">@Id<\/span>\r\n    <span class=\"nd\">@Column<\/span> <span class=\"o\">(<\/span><span class=\"n\">name<\/span><span class=\"o\">=<\/span><span class=\"s\">\"yyyymm\"<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">yyyymm<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"cm\">\/**  *\/<\/span>\r\n    <span class=\"nd\">@Id<\/span>\r\n    <span class=\"nd\">@Column<\/span> <span class=\"o\">(<\/span><span class=\"n\">name<\/span><span class=\"o\">=<\/span><span class=\"s\">\"dd\"<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">dd<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"cm\">\/**  *\/<\/span>\r\n    <span class=\"nd\">@Column<\/span> <span class=\"o\">(<\/span><span class=\"n\">name<\/span><span class=\"o\">=<\/span><span class=\"s\">\"plans\"<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">plans<\/span><span class=\"o\">;<\/span>\r\n<span class=\"c1\">\/\/ setter,getter<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5728@IdClass\u4e2d\u6307\u5b9a\u4e86\u5b9a\u4e49\u4e86\u4e3b\u952e\u7684\u7c7b\u3002<\/p>\n<p>5. \u7ec4\u5408\u4e3b\u952e\u7c7b<\/p>\n<pre class=\"post-pre\"><code><span class=\"kn\">package<\/span> <span class=\"nn\">com.stone.sample<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.io.Serializable<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">javax.persistence.Column<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">javax.persistence.Embeddable<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"nd\">@Embeddable<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">TCalendarPK<\/span> <span class=\"kd\">implements<\/span> <span class=\"nc\">Serializable<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"nd\">@Column<\/span> <span class=\"o\">(<\/span><span class=\"n\">name<\/span><span class=\"o\">=<\/span><span class=\"s\">\"yyyymm\"<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">yyyymm<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"nd\">@Column<\/span> <span class=\"o\">(<\/span><span class=\"n\">name<\/span><span class=\"o\">=<\/span><span class=\"s\">\"dd\"<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">dd<\/span><span class=\"o\">;<\/span>\r\n<span class=\"c1\">\/\/\u4ee5\u4e0b\u3001\u7701\u7565<\/span>\r\n<span class=\"c1\">\/\/setter, getter<\/span>\r\n<span class=\"c1\">\/\/hashcode,equals\u30e1\u30bd\u30c3\u30c9<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5728\u4f7f\u7528Eclipse\u65f6\uff0c\u60a8\u53ef\u4ee5\u53f3\u952e\u5355\u51fb\u5e76\u9009\u62e9\u6e90\u4ee3\u7801\uff0c\u7136\u540e\u81ea\u52a8\u521b\u5efasetter\u3001getter\u3001hashcode\u548cequals\u65b9\u6cd5\u3002<\/p>\n<p>\u4ed3\u5e93\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"kn\">package<\/span> <span class=\"nn\">com.stone.sample<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.data.jpa.repository.JpaRepository<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.data.jpa.repository.Query<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.data.repository.query.Param<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">interface<\/span> <span class=\"nc\">TCalendarRepository<\/span> <span class=\"kd\">extends<\/span> <span class=\"nc\">JpaRepository<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">TCalendar<\/span><span class=\"o\">,<\/span> <span class=\"nc\">TCalendarPK<\/span><span class=\"o\">&gt;{<\/span>\r\n    <span class=\"nd\">@Query<\/span><span class=\"o\">(<\/span><span class=\"s\">\"select o from TCalendar o where o.yyyymm = :yyyymm and o.dd = :dd\"<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"nc\">TCalendar<\/span> <span class=\"nf\">findByCompositePrimaryKey<\/span><span class=\"o\">(<\/span><span class=\"nd\">@Param<\/span><span class=\"o\">(<\/span><span class=\"s\">\"yyyymm\"<\/span><span class=\"o\">)<\/span><span class=\"kt\">int<\/span> <span class=\"n\">yyyymm<\/span><span class=\"o\">,<\/span><span class=\"nd\">@Param<\/span><span class=\"o\">(<\/span><span class=\"s\">\"dd\"<\/span><span class=\"o\">)<\/span><span class=\"kt\">int<\/span> <span class=\"n\">dd<\/span><span class=\"o\">);<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>7. \u63a7\u5236\u5668<\/p>\n<pre class=\"post-pre\"><code><span class=\"kn\">package<\/span> <span class=\"nn\">com.stone.sample<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.beans.factory.annotation.Autowired<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.stereotype.Controller<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.ui.Model<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.web.bind.annotation.RequestMapping<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.web.bind.annotation.RequestMethod<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"nd\">@Controller<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">SampleController<\/span> <span class=\"o\">{<\/span>\r\n\r\n    <span class=\"nd\">@Autowired<\/span>\r\n    <span class=\"nc\">TCalendarRepository<\/span> <span class=\"n\">repository<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"nd\">@RequestMapping<\/span><span class=\"o\">(<\/span><span class=\"n\">value<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"\/\"<\/span><span class=\"o\">,<\/span> <span class=\"n\">method<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">RequestMethod<\/span><span class=\"o\">.<\/span><span class=\"na\">GET<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">String<\/span> <span class=\"nf\">index<\/span><span class=\"o\">(<\/span><span class=\"nc\">Model<\/span> <span class=\"n\">model<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"nc\">TCalendar<\/span> <span class=\"n\">entity<\/span> <span class=\"o\">=<\/span> <span class=\"n\">repository<\/span><span class=\"o\">.<\/span><span class=\"na\">findByCompositePrimaryKey<\/span><span class=\"o\">(<\/span><span class=\"mi\">201804<\/span><span class=\"o\">,<\/span> <span class=\"mi\">5<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"n\">model<\/span><span class=\"o\">.<\/span><span class=\"na\">addAttribute<\/span><span class=\"o\">(<\/span><span class=\"s\">\"entity\"<\/span><span class=\"o\">,<\/span> <span class=\"n\">entity<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"s\">\"index\"<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u7528\u4e2d\u6587\u539f\u751f\u65b9\u5f0f\u89e3\u91ca\u4ee5\u4e0b\u5185\u5bb9\uff0c\u53ea\u9700\u8981\u4e00\u79cd\u9009\u62e9\uff1a<br \/>\n8. HTML<\/p>\n<p>\u7b54\u6848\uff1a HTML \u662f\u4e00\u79cd\u6807\u8bb0\u8bed\u8a00\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"cp\">&lt;!DOCTYPE html&gt;<\/span>\r\n<span class=\"nt\">&lt;html<\/span> <span class=\"na\">xmlns=<\/span><span class=\"s\">\"http:\/\/www.w3.org\/1999\/xhtml\"<\/span> <span class=\"na\">xmlns:th=<\/span><span class=\"s\">\"http:\/\/www.thymeleaf.org\"<\/span><span class=\"nt\">&gt;<\/span>\r\n    <span class=\"nt\">&lt;head&gt;<\/span>\r\n        <span class=\"nt\">&lt;title&gt;<\/span>Hello<span class=\"nt\">&lt;\/title&gt;<\/span>\r\n        <span class=\"nt\">&lt;meta<\/span> <span class=\"na\">charset=<\/span><span class=\"s\">\"utf-8\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n        <span class=\"nt\">&lt;style&gt;<\/span>\r\n        <span class=\"nt\">table<\/span> <span class=\"p\">{<\/span><span class=\"nl\">border<\/span><span class=\"p\">:<\/span> <span class=\"nb\">solid<\/span> <span class=\"m\">1px<\/span> <span class=\"m\">#000000<\/span><span class=\"p\">;<\/span> <span class=\"nl\">border-collapse<\/span><span class=\"p\">:<\/span> <span class=\"nb\">collapse<\/span><span class=\"p\">;}<\/span>\r\n        <span class=\"nt\">&lt;\/style&gt;<\/span>\r\n    <span class=\"nt\">&lt;\/head&gt;<\/span>\r\n    <span class=\"nt\">&lt;body&gt;<\/span>\r\n        <span class=\"nt\">&lt;h1&gt;<\/span>Springboot JPA Sample(Composite primary key)<span class=\"nt\">&lt;\/h1&gt;<\/span>\r\n        <span class=\"nt\">&lt;table<\/span> <span class=\"na\">border=<\/span><span class=\"s\">\"1\"<\/span><span class=\"nt\">&gt;<\/span>\r\n            <span class=\"nt\">&lt;thead&gt;<\/span>\r\n                <span class=\"nt\">&lt;tr&gt;<\/span>\r\n                    <span class=\"nt\">&lt;td&gt;<\/span>\u5e74\u6708<span class=\"nt\">&lt;\/td&gt;<\/span>\r\n                    <span class=\"nt\">&lt;td&gt;<\/span>\u65e5<span class=\"nt\">&lt;\/td&gt;<\/span>\r\n                    <span class=\"nt\">&lt;td&gt;<\/span>\u4e88\u5b9a<span class=\"nt\">&lt;\/td&gt;<\/span>\r\n                <span class=\"nt\">&lt;\/tr&gt;<\/span>\r\n            <span class=\"nt\">&lt;\/thead&gt;<\/span>\r\n            <span class=\"nt\">&lt;tbody&gt;<\/span>\r\n                <span class=\"nt\">&lt;tr<\/span> <span class=\"nt\">&gt;<\/span>\r\n                    <span class=\"nt\">&lt;td<\/span> <span class=\"na\">th:text=<\/span><span class=\"s\">\"${entity.yyyymm}\"<\/span><span class=\"nt\">&gt;&lt;\/td&gt;<\/span>\r\n                    <span class=\"nt\">&lt;td<\/span> <span class=\"na\">th:text=<\/span><span class=\"s\">\"*{entity.dd}\"<\/span><span class=\"nt\">&gt;&lt;\/td&gt;<\/span>\r\n                    <span class=\"nt\">&lt;td<\/span> <span class=\"na\">th:text=<\/span><span class=\"s\">\"*{entity.plans}\"<\/span><span class=\"nt\">&gt;&lt;\/td&gt;<\/span>\r\n                <span class=\"nt\">&lt;\/tr&gt;<\/span>\r\n            <span class=\"nt\">&lt;\/tbody&gt;<\/span>\r\n        <span class=\"nt\">&lt;\/table&gt;<\/span>\r\n    <span class=\"nt\">&lt;\/body&gt;<\/span>\r\n<span class=\"nt\">&lt;\/html&gt;<\/span>\r\n<\/code><\/pre>\n<p>\u5b9e\u73b0\u5b8c\u6210<\/p>\n<p>9. \u6211\u4f1a\u6267\u884c\u5e76\u786e\u8ba4\u4e00\u4e0b\u3002<br \/>\n\u5bf9\u9879\u76ee\u8fdb\u884c\u53f3\u952e\u70b9\u51fb\u2192\u9009\u62e9&#8221;\u8fd0\u884c&#8221;\u2192\u9009\u62e9&#8221;Spring Boot \u5e94\u7528\u7a0b\u5e8f&#8221;\u3002<br \/>\n\u8bbf\u95eehttp:\/\/localhost:8080\/\uff0c<br \/>\n\u4f1a\u663e\u793a\u4ee5\u4e0b\u7684\u754c\u9762\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d3f1937434c4406c8d4bf\/28-0.png\" alt=\"image.png\" \/><\/div>\n<p>\u4ee5\u4e0a\u5185\u5bb9\u5982\u4e0b\u3002 .)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6211\u4eec\u5c06\u5c1d\u8bd5\u5728Spring-JPA\u4e2d\u5bf9\u5177\u6709\u591a\u4e2a\u5217\u4f5c\u4e3a\u4e3b\u952e\u7684\u8868\u8fdb\u884c\u641c\u7d22\u5904\u7406\u3002 1. \u5f62\u6210 sample-compo [&hellip;]<\/p>\n","protected":false},"author":10,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-40208","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u4f7f\u7528SpringBoot\u548cSpring JPA\u6765\u67e5\u8be2\u5177\u6709\u591a\u4e2a\u5217\u4e3b\u952e\u7684\u8868 - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528springboot\u548cspring-jpa\u6765\u67e5\u8be2\u5177\u6709\u591a\u4e2a\u5217\u4e3b\u952e\u7684\u8868\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u4f7f\u7528SpringBoot\u548cSpring JPA\u6765\u67e5\u8be2\u5177\u6709\u591a\u4e2a\u5217\u4e3b\u952e\u7684\u8868\" \/>\n<meta property=\"og:description\" content=\"\u6211\u4eec\u5c06\u5c1d\u8bd5\u5728Spring-JPA\u4e2d\u5bf9\u5177\u6709\u591a\u4e2a\u5217\u4f5c\u4e3a\u4e3b\u952e\u7684\u8868\u8fdb\u884c\u641c\u7d22\u5904\u7406\u3002 1. \u5f62\u6210 sample-compo [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528springboot\u548cspring-jpa\u6765\u67e5\u8be2\u5177\u6709\u591a\u4e2a\u5217\u4e3b\u952e\u7684\u8868\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-04-26T07:15:33+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-29T21:02:33+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d3f1937434c4406c8d4bf\/28-0.png\" \/>\n<meta name=\"author\" content=\"\u5b87, \u534e\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u5b87, \u534e\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot%e5%92%8cspring-jpa%e6%9d%a5%e6%9f%a5%e8%af%a2%e5%85%b7%e6%9c%89%e5%a4%9a%e4%b8%aa%e5%88%97%e4%b8%bb%e9%94%ae%e7%9a%84%e8%a1%a8%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot%e5%92%8cspring-jpa%e6%9d%a5%e6%9f%a5%e8%af%a2%e5%85%b7%e6%9c%89%e5%a4%9a%e4%b8%aa%e5%88%97%e4%b8%bb%e9%94%ae%e7%9a%84%e8%a1%a8%e3%80%82\/\",\"name\":\"\u4f7f\u7528SpringBoot\u548cSpring JPA\u6765\u67e5\u8be2\u5177\u6709\u591a\u4e2a\u5217\u4e3b\u952e\u7684\u8868 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-04-26T07:15:33+00:00\",\"dateModified\":\"2024-04-29T21:02:33+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot%e5%92%8cspring-jpa%e6%9d%a5%e6%9f%a5%e8%af%a2%e5%85%b7%e6%9c%89%e5%a4%9a%e4%b8%aa%e5%88%97%e4%b8%bb%e9%94%ae%e7%9a%84%e8%a1%a8%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot%e5%92%8cspring-jpa%e6%9d%a5%e6%9f%a5%e8%af%a2%e5%85%b7%e6%9c%89%e5%a4%9a%e4%b8%aa%e5%88%97%e4%b8%bb%e9%94%ae%e7%9a%84%e8%a1%a8%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot%e5%92%8cspring-jpa%e6%9d%a5%e6%9f%a5%e8%af%a2%e5%85%b7%e6%9c%89%e5%a4%9a%e4%b8%aa%e5%88%97%e4%b8%bb%e9%94%ae%e7%9a%84%e8%a1%a8%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u4f7f\u7528SpringBoot\u548cSpring JPA\u6765\u67e5\u8be2\u5177\u6709\u591a\u4e2a\u5217\u4e3b\u952e\u7684\u8868\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458\",\"name\":\"\u5b87, \u534e\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g\",\"caption\":\"\u5b87, \u534e\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yuhua\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot%e5%92%8cspring-jpa%e6%9d%a5%e6%9f%a5%e8%af%a2%e5%85%b7%e6%9c%89%e5%a4%9a%e4%b8%aa%e5%88%97%e4%b8%bb%e9%94%ae%e7%9a%84%e8%a1%a8%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u4f7f\u7528SpringBoot\u548cSpring JPA\u6765\u67e5\u8be2\u5177\u6709\u591a\u4e2a\u5217\u4e3b\u952e\u7684\u8868 - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528springboot\u548cspring-jpa\u6765\u67e5\u8be2\u5177\u6709\u591a\u4e2a\u5217\u4e3b\u952e\u7684\u8868\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u4f7f\u7528SpringBoot\u548cSpring JPA\u6765\u67e5\u8be2\u5177\u6709\u591a\u4e2a\u5217\u4e3b\u952e\u7684\u8868","og_description":"\u6211\u4eec\u5c06\u5c1d\u8bd5\u5728Spring-JPA\u4e2d\u5bf9\u5177\u6709\u591a\u4e2a\u5217\u4f5c\u4e3a\u4e3b\u952e\u7684\u8868\u8fdb\u884c\u641c\u7d22\u5904\u7406\u3002 1. \u5f62\u6210 sample-compo [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528springboot\u548cspring-jpa\u6765\u67e5\u8be2\u5177\u6709\u591a\u4e2a\u5217\u4e3b\u952e\u7684\u8868\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-04-26T07:15:33+00:00","article_modified_time":"2024-04-29T21:02:33+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d3f1937434c4406c8d4bf\/28-0.png"}],"author":"\u5b87, \u534e","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u5b87, \u534e","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"3 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot%e5%92%8cspring-jpa%e6%9d%a5%e6%9f%a5%e8%af%a2%e5%85%b7%e6%9c%89%e5%a4%9a%e4%b8%aa%e5%88%97%e4%b8%bb%e9%94%ae%e7%9a%84%e8%a1%a8%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot%e5%92%8cspring-jpa%e6%9d%a5%e6%9f%a5%e8%af%a2%e5%85%b7%e6%9c%89%e5%a4%9a%e4%b8%aa%e5%88%97%e4%b8%bb%e9%94%ae%e7%9a%84%e8%a1%a8%e3%80%82\/","name":"\u4f7f\u7528SpringBoot\u548cSpring JPA\u6765\u67e5\u8be2\u5177\u6709\u591a\u4e2a\u5217\u4e3b\u952e\u7684\u8868 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-04-26T07:15:33+00:00","dateModified":"2024-04-29T21:02:33+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot%e5%92%8cspring-jpa%e6%9d%a5%e6%9f%a5%e8%af%a2%e5%85%b7%e6%9c%89%e5%a4%9a%e4%b8%aa%e5%88%97%e4%b8%bb%e9%94%ae%e7%9a%84%e8%a1%a8%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot%e5%92%8cspring-jpa%e6%9d%a5%e6%9f%a5%e8%af%a2%e5%85%b7%e6%9c%89%e5%a4%9a%e4%b8%aa%e5%88%97%e4%b8%bb%e9%94%ae%e7%9a%84%e8%a1%a8%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot%e5%92%8cspring-jpa%e6%9d%a5%e6%9f%a5%e8%af%a2%e5%85%b7%e6%9c%89%e5%a4%9a%e4%b8%aa%e5%88%97%e4%b8%bb%e9%94%ae%e7%9a%84%e8%a1%a8%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u4f7f\u7528SpringBoot\u548cSpring JPA\u6765\u67e5\u8be2\u5177\u6709\u591a\u4e2a\u5217\u4e3b\u952e\u7684\u8868"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458","name":"\u5b87, \u534e","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g","caption":"\u5b87, \u534e"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yuhua\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot%e5%92%8cspring-jpa%e6%9d%a5%e6%9f%a5%e8%af%a2%e5%85%b7%e6%9c%89%e5%a4%9a%e4%b8%aa%e5%88%97%e4%b8%bb%e9%94%ae%e7%9a%84%e8%a1%a8%e3%80%82\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/40208","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=40208"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/40208\/revisions"}],"predecessor-version":[{"id":89850,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/40208\/revisions\/89850"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=40208"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=40208"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=40208"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}