maven
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.32.Final</version>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
配置
我使用的文件存储
spring.datasource.url= jdbc:hsqldb:file:./data/logdb;shutdown=true
spring.datasource.username=
spring.datasource.password=
spring.datasource.driverClassName =org.hsqldb.jdbcDriver
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.use-new-id-generator-mappings=false
IDEA连接数据库
这一步主要是可以通过idea管理数据库,进行操作很方便
1.添加数据源
2.设置本地的驱动程序,填写相关信息即可,如果不存在这个数据库,会创建数据库,建议通过这个方式创建数据库,不然可能出现异常报错。注意url里设置shutdown=true,不然异常关闭数据库也会报错
3.console。可以通过console进行SQL操作,很方便
实体类
主要针对有继承关系的情况
在基类使用JOINED策略,派生类不做什么特殊配置,数据库中基类表和派生类表用外键关联,分别存储信息。其它映射方式可参考Hibernate(Spring-Data)3种实体继承创建表方式指南
基类,我这里用了lombok.Data,使用主键自增
@Data
@NoArgsConstructor
@SuperBuilder
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "Plan")
public class Plan {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
private int id;
}
派生类
@Data
@AllArgsConstructor
@SuperBuilder
@Entity
@Table(name = "yearplan")
public class YearPlan extends Plan {
private int year;
public YearPlan() {
}
}
数据库建表
主要是设置自增策略、外键更新策略,设置自增从1开始,因为JPA中,id为0的数据会无法操作
CREATE TABLE Plan
(id INT GENERATED BY DEFAULT AS IDENTITY(START WITH 1 INCREMENT BY 1) ,
text VARCHAR(256),
state INT,
PRIMARY KEY (id));
CREATE TABLE YearPlan
(id INT,
year INT,
FOREIGN KEY (id) REFERENCES Plan(id) on DELETE cascade ON update cascade );
JPA、数据使用
使用JpaRepository会有很多问题,比如触发约束不满足、方法不存在等,save在id相同时,相当于update
import org.app.mylog.dataplane.entity.Plan;
//import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface PlanDao extends CrudRepository<Plan, Integer> {
Plan save(Plan plan);
void deleteById(int ID);
}