Hibernate学习1 - 入门基本使用、一对多映射、多对一映射、多对多映射的使用

x33g5p2x  于2022-06-27 转载在 其他  
字(18.6k)|赞(0)|评价(0)|浏览(606)

概述 = Hibernate实现JPA规范

使用 === 注意测试懒加载时别DeBug模式 = 因为Debug会调用对象内懒加载的属性从而发送了SQL

基本使用 ===

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>top.linruchang</groupId>
  7. <artifactId>HibernateDemo</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <properties>
  10. <maven.compiler.source>8</maven.compiler.source>
  11. <maven.compiler.target>8</maven.compiler.target>
  12. </properties>
  13. <dependencies>
  14. <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
  15. <dependency>
  16. <groupId>org.projectlombok</groupId>
  17. <artifactId>lombok</artifactId>
  18. <version>1.18.20</version>
  19. <scope>provided</scope>
  20. </dependency>
  21. <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
  22. <dependency>
  23. <groupId>cn.hutool</groupId>
  24. <artifactId>hutool-all</artifactId>
  25. <version>5.6.3</version>
  26. </dependency>
  27. <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
  28. <dependency>
  29. <groupId>mysql</groupId>
  30. <artifactId>mysql-connector-java</artifactId>
  31. <version>8.0.23</version>
  32. </dependency>
  33. <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
  34. <dependency>
  35. <groupId>org.hibernate</groupId>
  36. <artifactId>hibernate-core</artifactId>
  37. <version>6.0.0.Alpha7</version>
  38. </dependency>
  39. <!-- https://mvnrepository.com/artifact/junit/junit -->
  40. <dependency>
  41. <groupId>junit</groupId>
  42. <artifactId>junit</artifactId>
  43. <version>4.13.2</version>
  44. </dependency>
  45. </dependencies>
  46. <build>
  47. <!--特别注意:如果你是把Article.hbm.xml这些映射文件放到src下的beanentity目录,则需要定义这里,像我一样放到resources也不需要设置这一段-->
  48. <resources>
  49. <resource>
  50. <directory>src/main/java</directory>
  51. <includes>
  52. <include>**/*.xml</include>
  53. </includes>
  54. <filtering>false</filtering>
  55. </resource>
  56. </resources>
  57. </build>
  58. </project>

hibernate.cfg.xml

  1. <?xml version='1.0' encoding='utf-8'?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3. "-//Hibernate/Hibernate Configuration DTD//EN"
  4. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  5. <hibernate-configuration>
  6. <!-- 以/jndi/name绑定到JNDI的SessionFactory实例 -->
  7. <!--<session-factory name="java:hibernate/SessionFactory">-->
  8. <session-factory >
  9. <!-- ===============数据源配置属性=============== -->
  10. <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
  11. <property name="connection.username">root</property>
  12. <property name="connection.password">root</property>
  13. <property name="connection.url">jdbc:mysql://localhost:3306/test?useSSL=false&amp;characterEncoding=UTF-8&amp;serverTimezone=Asia/Shanghai</property>
  14. <!-- ===============C3P0连接池配置=============== -->
  15. <!-- 连接池中最少有多少个数据库连接 -->
  16. <property name="hibernate.c3p0.min_size">30</property>
  17. <!-- 连接池中允许的最大数据库连接数 -->
  18. <property name="hibernate.c3p0.max_size">30</property>
  19. <!-- 最大的PreparedStatement的数量 -->
  20. <property name="hibernate.c3p0.max_statements">10</property>
  21. <!--数据库连接不够时,每次增加的连接数-->
  22. <property name="hibernate.c3p0.acquire_increment">10</property>
  23. <!--数据库连接不用时,多长时间释放该连接,以秒为单位-->
  24. <property name="hibernate.c3p0.idle_test_period">10000</property>
  25. <!--连接处理最大时间,如果超过这个时间,会抛出异常,以豪秒为单位-->
  26. <property name="hibernate.c3p0.timeout">5000</property>
  27. <!-- ===============数据库方言=============== -->
  28. <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
  29. <!-- ===============功能=============== -->
  30. <!--打印SQL-->
  31. <property name="show_sql">true</property>
  32. <!--格式化SQL语句-->
  33. <property name="format_sql">true</property>
  34. <!--是否自动生成数据库-->
  35. <property name="hibernate.hbm2ddl.auto"/>
  36. <!-- ===============注册实体关系映射文件=============== -->
  37. <mapping resource="mapping/SysUser.hbm.xml"></mapping>
  38. <mapping resource="mapping/Article.hbm.xml"></mapping>
  39. <!--将此映射文件直接放到跟Bean的源码目录包下的写法-->
  40. <!--<mapping resource="top/linruchang/entity/SysUser.hbm.xml"></mapping>-->
  41. <!--<mapping resource="top/linruchang/entity/Article.hbm.xml"></mapping>-->
  42. </session-factory>
  43. </hibernate-configuration>

Article.hbm.xml

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6. <class name="top.linruchang.entity.Article" table="article">
  7. <id name="id" type="java.lang.String">
  8. <column name="id" ></column>
  9. <!--插入时,如果你没有设置ID,会帮你自动添加ID-->
  10. <generator class="uuid"></generator>
  11. </id>
  12. <property name="title" type="java.lang.String">
  13. <column name="title"></column>
  14. </property>
  15. <property name="content" type="java.lang.String">
  16. <column name="content"></column>
  17. </property>
  18. <property name="likeNum" type="java.lang.Integer">
  19. <column name="like_num"></column>
  20. </property>
  21. </class>
  22. </hibernate-mapping>

Article.java

  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. @Builder
  5. @Accessors(chain = true)
  6. public class Article extends BaseEntity {
  7. private static final long serialVersionUID = -4714261187453073302L;
  8. private SysUser sysUser;
  9. /** 文章标题 */
  10. private String title;
  11. /** 文章内容 */
  12. private String content;
  13. private String abbreviationContent;
  14. /** 文章被查看次数 */
  15. private Integer checkNum;
  16. /** 当前文章被点赞数 */
  17. private Integer likeNum;
  18. /** 当前文章不喜欢数 */
  19. private Integer notLikeNum;
  20. /** 文章是否违规:0未违规 1违规 - 违规不可显示 */
  21. private Integer isViolation;
  22. /** 创建者 - 冗余字段 - user表的nickName */
  23. private String createBy;
  24. /**列表文章的图片显示 - 如果指定则使用指定的图片(功能未做),没有指定则使用文章第一张图片,在没有则使用文章中有图标则使用目录分裂的图片*/
  25. private String imgUrl;
  26. /**文章内部图片*/
  27. private String imgUrls;
  28. /**文章内容类型:1富文本 2Markdown 3留空*/
  29. private String type;
  30. /**文章状态;-1违规 0草稿 1发布且公开 2发布且私密*/
  31. private String status;
  32. }

MyTest.java

  1. public class MyTest {
  2. public static void main(String[] args) {
  3. Configuration configure = new Configuration().configure();
  4. //获取sessionFactory
  5. SessionFactory sessionFactory = configure.buildSessionFactory();
  6. //获取数据库连接session
  7. Session session = sessionFactory.openSession();
  8. Article article = session.find(Article.class, "0f67d9f1953c7ab6036ece36cb5e1133");
  9. System.out.println(article);
  10. Article saveArticle = Article.builder()
  11. .checkNum(20)
  12. .likeNum(100)
  13. .content("你好")
  14. .title("爱你似懂非懂舒服的").build();
  15. saveArticle.setId(UUID.fastUUID().toString(true));
  16. Object save = session.save(saveArticle);
  17. System.out.println(save);
  18. // System.out.println(saveArticle.getId());
  19. // System.out.println(save);
  20. //特别注意:这里必须手动提交事务
  21. session.beginTransaction().commit();
  22. session.close();
  23. }
  24. }

一对多映射

一个用户对应多篇文章


SysUser.java

  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. @Builder
  5. @Accessors(chain = true)
  6. public class SysUser extends BaseEntity {
  7. private static final long serialVersionUID = 2095940921263481761L;
  8. Set<Article> articles;
  9. /** 用户昵称 - 如果没有设置昵称直接使用账户名显示 */
  10. private String nickName;
  11. /** 头像图片地址 */
  12. private String headUrl;
  13. /** 账户 */
  14. private String loginName;
  15. /** 密码 */
  16. private String password;
  17. /** 手机号 */
  18. private String phoneNumber;
  19. /** 邮箱 */
  20. private String email;
  21. /** 性别 */
  22. private Integer gender;
  23. /** 个性签名 */
  24. private String personalMotto;
  25. /** 最近登录时间 - 格式 - yyyyMMddHHmmss */
  26. private String lastLoginTime;
  27. /** 登录状态:0未登录 1单设备登陆 2多设备登陆 */
  28. private Integer loginStatus;
  29. /** 账户禁用状态:0账户可使用 1账户不可使用(封号) */
  30. private Integer disabledStatus;
  31. }


Article.java

  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. @Builder
  5. @Accessors(chain = true)
  6. public class Article extends BaseEntity {
  7. private static final long serialVersionUID = -4714261187453073302L;
  8. private SysUser sysUser;
  9. private String userId;
  10. /** 文章标题 */
  11. private String title;
  12. /** 文章内容 */
  13. private String content;
  14. private String abbreviationContent;
  15. /** 文章被查看次数 */
  16. private Integer checkNum;
  17. /** 当前文章被点赞数 */
  18. private Integer likeNum;
  19. /** 当前文章不喜欢数 */
  20. private Integer notLikeNum;
  21. /** 文章是否违规:0未违规 1违规 - 违规不可显示 */
  22. private Integer isViolation;
  23. /** 创建者 - 冗余字段 - user表的nickName */
  24. private String createBy;
  25. /**列表文章的图片显示 - 如果指定则使用指定的图片(功能未做),没有指定则使用文章第一张图片,在没有则使用文章中有图标则使用目录分裂的图片*/
  26. private String imgUrl;
  27. /**文章内部图片*/
  28. private String imgUrls;
  29. /**文章内容类型:1富文本 2Markdown 3留空*/
  30. private String type;
  31. /**文章状态;-1违规 0草稿 1发布且公开 2发布且私密*/
  32. private String status;
  33. }


SysUser.hbm.xml

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6. <class name="top.linruchang.entity.SysUser" table="sys_user">
  7. <id name="id" type="java.lang.String">
  8. <column name="id"></column>
  9. <!--插入时,如果你没有设置ID,会帮你自动添加ID-->
  10. <generator class="uuid"></generator>
  11. </id>
  12. <property name="headUrl" type="java.lang.String">
  13. <column name="head_url" ></column>
  14. </property>
  15. <property name="loginName" type="java.lang.String">
  16. <column name="login_name" ></column>
  17. </property>
  18. <set name="articles" table="article">
  19. <!-- Article表的外键列名-->
  20. <key column="user_id"></key>
  21. <one-to-many class="top.linruchang.entity.Article"></one-to-many>
  22. </set>
  23. </class>
  24. </hibernate-mapping>


Article.hbm.xml

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6. <class name="top.linruchang.entity.Article" table="article">
  7. <id name="id" type="java.lang.String">
  8. <column name="id" ></column>
  9. <!--插入时,如果你没有设置ID,会帮你自动添加ID-->
  10. <generator class="uuid"></generator>
  11. </id>
  12. <!--逻辑外键,即sysUser表的主键ID-->
  13. <property name="userId" type="java.lang.String">
  14. <column name="user_id"></column>
  15. </property>
  16. <property name="title" type="java.lang.String">
  17. <column name="title"></column>
  18. </property>
  19. <property name="content" type="java.lang.String">
  20. <column name="content"></column>
  21. </property>
  22. <property name="likeNum" type="java.lang.Integer">
  23. <column name="like_num"></column>
  24. </property>
  25. <!--<property name="sysUser" type="top.linruchang.entity.SysUser">-->
  26. <!-- <column name="like_num"></column>-->
  27. <!--</property>-->
  28. </class>
  29. </hibernate-mapping>


Article.hbm.xml

  1. @Test
  2. public void test1() {
  3. Configuration configure = new Configuration().configure();
  4. // 获取sessionFactory
  5. SessionFactory sessionFactory = configure.buildSessionFactory();
  6. // 获取数据库连接session
  7. Session session = sessionFactory.openSession();
  8. SysUser sysUser = session.find(SysUser.class, "6d72c93aa292cf2ca2e789919a5e7bdc");
  9. System.out.println(sysUser);
  10. }

多对一映射


MyOrder.java

  1. @Data
  2. @ToString(callSuper = true)
  3. public class MyOrder extends BaseEntity{
  4. MyUser myUser;
  5. String name;
  6. String money;
  7. }


MyUser.java

  1. @Data
  2. @ToString(callSuper = true)
  3. public class MyUser extends BaseEntity{
  4. String name;
  5. }


MyOrder.hbm.xml

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6. <class name="top.linruchang.entity.MyOrder" table="my_order">
  7. <id name="id" type="java.lang.String">
  8. <column name="id"></column>
  9. <!--插入时,如果你没有设置ID,会帮你自动添加ID-->
  10. <generator class="uuid"></generator>
  11. </id>
  12. <property name="name" type="java.lang.String">
  13. <column name="name"></column>
  14. </property>
  15. <property name="money" type="java.lang.String">
  16. <column name="money"></column>
  17. </property>
  18. <many-to-one name="myUser" column="user_id" class="top.linruchang.entity.MyUser"></many-to-one>
  19. </class>
  20. </hibernate-mapping>


MyUser.hbm.xml

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6. <class name="top.linruchang.entity.MyUser" table="my_user">
  7. <id name="id" type="java.lang.String">
  8. <column name="id"></column>
  9. <!--插入时,如果你没有设置ID,会帮你自动添加ID-->
  10. <generator class="uuid"></generator>
  11. </id>
  12. <property name="name" type="java.lang.String">
  13. <column name="name"></column>
  14. </property>
  15. </class>
  16. </hibernate-mapping>

查询


MyTest.java

  1. public class MyTest {
  2. @Test
  3. public void test3() {
  4. Configuration configure = new Configuration().configure();
  5. //获取sessionFactory
  6. SessionFactory sessionFactory = configure.buildSessionFactory();
  7. //获取数据库连接session
  8. Session session = sessionFactory.openSession();
  9. MyOrder myOrder = session.find(MyOrder.class, "9ac327eda05d11ebb7a6b42e99ea3e61");
  10. MyUser myUser = myOrder.getMyUser();
  11. System.out.println(myOrder);
  12. }
  13. }

插入

  1. @Test
  2. public void test4() {
  3. Configuration configure = new Configuration().configure();
  4. //获取sessionFactory
  5. SessionFactory sessionFactory = configure.buildSessionFactory();
  6. //获取数据库连接session
  7. Session session = sessionFactory.openSession();
  8. Transaction transaction = session.beginTransaction();
  9. MyOrder myOrder = new MyOrder();
  10. myOrder.setId(UUID.fastUUID().toString(true));
  11. myOrder.setName("热狗");
  12. myOrder.setMoney("5");
  13. MyUser myUser = new MyUser();
  14. myUser.setId(UUID.fastUUID().toString(true));
  15. myUser.setName("立法的方式地方=====");
  16. myOrder.setMyUser(myUser);
  17. //先插入外键表的数据
  18. Object insertUserId = session.save(myUser);
  19. System.out.println(insertUserId);
  20. //随后在插入主表的数据
  21. Object insertOrderId = session.save(myOrder);
  22. System.out.println(insertOrderId);
  23. transaction.commit();
  24. session.close();
  25. }

多对多映射 == 需要中间表


MyOrder2.java

  1. @Getter
  2. @Setter
  3. public class MyOrder2 extends BaseEntity{
  4. String name;
  5. String money;
  6. Set<MyUser2> myUser2;
  7. @Override
  8. public String toString() {
  9. return "MyOrder2{" +
  10. "id='" + getId() + '\'' +
  11. "name='" + name + '\'' +
  12. ", money='" + money + '\'' +
  13. '}';
  14. }
  15. }


MyUser2.java

  1. @Getter
  2. @Setter
  3. public class MyUser2 extends BaseEntity{
  4. String name;
  5. Set<MyOrder2> myOrder2;
  6. @Override
  7. public String toString() {
  8. return "MyUser2{" +
  9. "id='" + getId() + '\'' +
  10. "name='" + name + '\'' +
  11. '}';
  12. }
  13. }


UserOrderRel.java

  1. @Getter
  2. @Setter
  3. public class UserOrderRel extends BaseEntity{
  4. String myUserId;
  5. String myOrderId;
  6. }


MyOrder2.hbm.xml

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6. <class name="top.linruchang.entity.MyOrder2" table="my_order">
  7. <id name="id" type="java.lang.String">
  8. <column name="id"></column>
  9. <!--插入时,如果你没有设置ID,会帮你自动添加ID-->
  10. <generator class="uuid"></generator>
  11. </id>
  12. <property name="name" type="java.lang.String">
  13. <column name="name"></column>
  14. </property>
  15. <property name="money" type="java.lang.String">
  16. <column name="money"></column>
  17. </property>
  18. <set name="myUser2" table="user_order_rel">
  19. <key column="my_order_id" ></key>
  20. <many-to-many column="my_user_id" class="top.linruchang.entity.MyUser2"></many-to-many>
  21. </set>
  22. </class>
  23. </hibernate-mapping>


MyUser2.hbm.xml

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6. <class name="top.linruchang.entity.MyUser2" table="my_user">
  7. <id name="id" type="java.lang.String">
  8. <column name="id"></column>
  9. <!--插入时,如果你没有设置ID,会帮你自动添加ID-->
  10. <generator class="uuid"></generator>
  11. </id>
  12. <property name="name" type="java.lang.String">
  13. <column name="name"></column>
  14. </property>
  15. <set name="myOrder2" table="user_order_rel">
  16. <key column="my_user_id" ></key>
  17. <many-to-many column="my_order_id" class="top.linruchang.entity.MyOrder2"></many-to-many>
  18. </set>
  19. </class>
  20. </hibernate-mapping>


UserOrderRel.hbm.xml

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6. <class name="top.linruchang.entity.UserOrderRel" table="user_order_rel">
  7. <id name="id" type="java.lang.String">
  8. <column name="id"></column>
  9. <!--插入时,如果你没有设置ID,会帮你自动添加ID-->
  10. <generator class="uuid"></generator>
  11. </id>
  12. <property name="myUserId" type="java.lang.String">
  13. <column name="my_user_id"></column>
  14. </property>
  15. <property name="myOrderId" type="java.lang.String">
  16. <column name="my_order_id"></column>
  17. </property>
  18. </class>
  19. </hibernate-mapping>


MyTest.java

  1. public class MyTest {
  2. @Test
  3. public void test5() {
  4. Configuration configure = new Configuration().configure();
  5. SessionFactory sessionFactory = configure.buildSessionFactory();
  6. Session session = sessionFactory.openSession();
  7. MyOrder2 myOrder2 = session.find(MyOrder2.class, "4028b88178e60a910178e60a94c90001");
  8. System.out.println(myOrder2);
  9. System.out.println(myOrder2.getMyUser2());
  10. session.close();
  11. }
  12. }

相关文章