首先 是 创建 entity
拉取 jpa 的 依赖
<dependencies> <!-- data-jpa --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- projectlombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!-- fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.54</version> </dependency> </dependencies>
application.properties
#服务名称 spring.application.name=jpa-service server.port=1001 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/jpadome?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=123456 spring.datasource.type=com.zaxxer.hikari.HikariDataSource #时区设置 spring.jackson.time-zone=GMT+8 #是否显示SQL spring.jpa.show-sql=true #指定MySQl方言 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect #设置存储引擎为InnoDB spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect spring.jpa.hibernate.ddl-auto=update
拉取 两个 配置
创建 实体类 user
@Data @Entity @Table(name = "users") public class UserEnetity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "u_id") private Integer id; /** * 手机号 */ private String phone; @OneToOne(targetEntity = CardEntity.class,mappedBy = "userEnetity",cascade = CascadeType.ALL) private CardEntity card; }
创建 实体类 card
@Data @Entity @Table(name = "card") public class CardEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; /** * 身份证号 */ @Column(name="idCard",length = 18) private String idCard; /** * 性别 */ private String sex; /** * 地址 */ private String address; /** * 名族 */ private String minZu; /** * 出生日期 */ @Temporal(TemporalType.DATE) private Date birth; @OneToOne(targetEntity = UserEnetity.class,cascade = CascadeType.PERSIST) @JoinColumn(name = "u_id") private UserEnetity userEnetity;
实现理念
两个表 是 user 和 card 分别 是 用户对应身份证的 一对一 关系
@Id 注解
标注用于声明一个实体类的属性映射为数据库的主键列。
@GeneratedValue 注解
@GeneratedValue 用于标注主键的生成策略,通过 strategy 属性指定。默认情况下,JPA 自动选择一个最适合底层数据库的主键生成策略:SqlServer 对应 identity,MySQL 对应 auto increment
IDENTITY:采用数据库 ID自增长的方式来自增主键字段,Oracle 不支持这种方式; AUTO: JPA自动选择合适的策略,是默认选项; SEQUENCE:通过序列产生主键,通过 @SequenceGenerator 注解指定序列名,MySql 不支持这种方式 TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。
白话就是 用于 自增
@Column 注解
就是 创建 你在 sql表 中的 字段名
@JoinColumn注释的是保存表与表之间关系的字段,它要标注在实体属性上。
@Column标注的是表中不包含表关系的字段。
@Temporal 注解
在核心的 Java API 中并没有定义 Date 类型的精度(temporal precision). 而在数据库中,表示 Date 类型的数据有 DATE, TIME, 和 TIMESTAMP 三种精度(即单纯的日期,时间,或者两者 兼备).
接下 来 就是与上面代码相关 的 注解了
@OneToOne,@OneToMany,@ManyToOne,@ManyToMany中有cascade属性
cascade 是 级联
只有“关系标记”(一对多关系中多的一方)才有cascade属性;
cascade 中的 属性 操作
1.cascade=”none”,默认值,告诉Hibernate忽略关系。
hibernate是一种ORM(对象映射)框架的持久性框架, 它是对JDBC做了轻量级的封装, 使得程序员可以面向对象思维的对数据库进行操作。
-
CascadeType.REMOVE 级联删除操作。 删除当前实体时,与它有映射关系的实体也会跟着被删除。
-
CascadeType.MERGE 级联更新(合并)操作。
当Student中的数据改变,会相应地更新Course中的数据。
-
CascadeType.DETACH 级联脱管/游离操作。
如果你要删除一个实体,但是它有外键无法删除,你就需要这个级联权限了。它会撤销所有相关的外键关联。
-
CascadeType.REFRESH 级联刷新操作。
@oneToOne 注解
字母理解 就是 一对一 完 后 cascabe是 级联
all 是包含所有注解 其他的上文有 自己可以试一试哦
双向一对一
targetEntity 是指向类的意思
相同点: @Column标记一样,name属性是用来标识表中所对应的字段的名称。
mappedBy = "userEnetity"
mappedBy的意思就是“被映射”,即mappedBy这方不用管关联关系,关联关系交给另一方处理
mappedBy 的 详细 讲解 地址
@Component public interface CardRepository extends JpaRepository<CardEntity,Integer> { }
实现接口 就阔以 调用 CRUD ok了
创建表时会报错
Cannot execute request on any known server euarka 的 连接不到 因为没有配置
java.net.ConnectException: Connection refused: connect 端口号 重复 这两个错误
不会耽误你的 建表 以及表的 关系 的