山一程--软件开发--Spring JPA Hibernate - JPA 2

目的:精研数据架构关联 Spring JPA2 Hibernate 技术


reference:

1.<Spring 5 高级编程> chapter 8, 关联chapter 7

2.<Java persistence with Hibernate 2nd>

 


要点:

JPA2 规范是EAGER 加载,不同于Hibernate 默认 Lazy加载.

mysql 配置

create user 'PRACTICE_SPRING_JPA2_P1'@'LOCALHOST' identified BY 'admin';
create schema PRACTICE_SPRING_JPA2_P1 character set 'utf8mb4';
grant all privileges  ON PRACTICE_SPRING_JPA2_P1 .* TO 'PRACTICE_SPRING_JPA2_P1'@'LOCALHOST';
flush PRIVILEGES;
SET GLOBAL time_zone="+3:00";

use PRACTICE_SPRING_JPA2_P1;

CREATE TABLE SINGER(
    ID bigint not null primary key auto_increment,
    VERSION int not null default 0,
    FIRST_NAME VARCHAR(60) NOT NULL,
    LAST_NAME VARCHAR(60) NOT NULL,
    BIRTH_DATE DATE,
    UNIQUE UQ_SINGER_1 (FIRST_NAME,LAST_NAME)    
)ENGINE = InnoDB;

CREATE TABLE ALBUM(
    ID bigint not null primary key auto_increment,
    SINGER_ID bigint not null,
    VERSION int not null default 0,
    TITLE VARCHAR(255) NOT NULL,
    RELEASE_DATE DATE,
    UNIQUE UQ_ALBUM_1 (SINGER_ID,TITLE),
    CONSTRAINT FK_ALBUM_SINGER foreign key (SINGER_ID) REFERENCES SINGER(ID)    
)ENGINE = InnoDB;

CREATE TABLE INSTRUMENT(
    ID VARCHAR(20) NOT NULL PRIMARY KEY
)ENGINE = InnoDB;

CREATE TABLE SINGER_INSTRUMENT(
    SINGER_ID bigint not null,
    INSTRUMENT_ID varchar(20) not null,
    CONSTRAINT FK_SINGER_INSTRUMENT_1 FOREIGN KEY (SINGER_ID) REFERENCES SINGER(ID),
    CONSTRAINT FK_INSTRUMENT_SINGER_1 FOREIGN KEY (INSTRUMENT_ID) REFERENCES INSTRUMENT(ID)
)ENGINE = InnoDB;
View Code

Spring boot 2   /  JPA2

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

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>

 

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = {"org.road.base.practice_spring_jpa2_p3"})
@ComponentScan(basePackages = {
        "org.road.base.practice_spring_jpa2_p3"})
public class JpaConfig {

    @Bean
    public JpaTransactionManager transactionManager(DataSource dataSource){
        return new JpaTransactionManager(entityManagerFactory(dataSource));
    }

    @Bean
    public JpaVendorAdapter jpaVendorAdapter(){
        return new HibernateJpaVendorAdapter();
    }

    @Bean
    public Properties hibernatePros(){
        Properties hibernateProp = new Properties();
        hibernateProp.put("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect");
        hibernateProp.put("hibernate.max_fetch_depth", 3);
        hibernateProp.put("hibernate.jdbc.batch_size", 10);
        hibernateProp.put("hibernate.jdbc.fetch_size", 50);
        hibernateProp.put("hibernate.format_sql", true);
        hibernateProp.put("hibernate.use_sql_comments", true);
        hibernateProp.put("hibernate.show_sql", true);
        return hibernateProp;
    }

    @Bean
    public EntityManagerFactory entityManagerFactory(DataSource dataSource){
        LocalContainerEntityManagerFactoryBean factoryBean =
                new LocalContainerEntityManagerFactoryBean();
        factoryBean.setPackagesToScan("org.road.base.practice_spring_jpa2_p3");
        factoryBean.setDataSource(dataSource);
        factoryBean.setJpaVendorAdapter(jpaVendorAdapter());
        factoryBean.setJpaProperties(hibernatePros());
        factoryBean.afterPropertiesSet();
        return factoryBean.getNativeEntityManagerFactory();
    }

}

如果需要自定义查询。带参数的如下:

 


1.Spring config , 配置

注入

如果程序有多个 持久化单元(dataSource) 则 设置不同的 unitName


应用程序和数据库架构的映射:

1.映射嵌套的可嵌入组件.

实例中数据库架构只有一个 Users 表. 摊平集合了三个类的信息字段.

User 类中 有一个 Address 类引用, Address 类有一个 City 引用。


映射集合和实体关联:

1.数据库架构:没有集合或组合生命周期

USE HIBERNATE_IN_ACTION_P1;
create table ITEM(
ID bigint primary key not null auto_increment,
NAME varchar(50) not null
)Engine = InnoDB;

create table IMAGE(
  ITEM_ID bigint not null,
  FILENAME varchar(50) not null,
  constraint primary key(ITEM_id, FILENAME),
  constraint foreign key FK_ITEM_IMAG (ITEM_ID) references ITEM(ID) on delete cascade
)Engine = InnoDB

集合接口用泛型来简化。

事务性文件系统选型:XADisk, Bitronix..


2023-08-30

当JpaRepository<Cls,T> 继承的接口需要增加自定义查询,可用如下方式:

 

posted @ 2023-05-07 21:06  君子之行  阅读(12)  评论(0)    收藏  举报