山一程--软件开发--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;
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> 继承的接口需要增加自定义查询,可用如下方式:


浙公网安备 33010602011771号