【Hibernate】Re03 注解方式实现
使用JPA规范提供的注解即可实现,这样的好处是不需要配置Entity.hbm.xml文件了
但是考虑到多表查询的情况,还是会有xml配置的需要。
一、常用的JPA注解:
1、public @interface javax.persistence.Entity
注解的类声明为持久化类 2、public @interface javax.persistence.Table
为持久化类指定数据表名称(table),默认值是首字母小写的类名
目录名称(catalog)
和约束名称(schema) 3、public @interface javax.persistence.Id
声明持久化类的标识属性,OID,也就是主键 4、public @interface javax.persistence.GeneratedValue
定义标识属性值的生成策略 5、public @interface javax.persistence.UniqueConstraint
表的唯一约束 6、public @interface javax.persistence.Lob
注解的属性持久化为Blob或者Clob类型 7、public @interface javax.persistence.Column
属性映射到数据库字段,指定name值为表字段名称 8、public @interface javax.persistence.Transient
指定非持久化的字段属性
创建User实体类:
官方的实例中是把注解打在GETTER方法上的,和之前的视频教程并不一样
package cn.zeal4j.domain; /**
* @author Administrator
* @file Hibernate
* @create 2020 09 23 22:09
*/ import org.hibernate.annotations.GenericGenerator; import javax.persistence.*;
import java.io.Serializable;
import java.util.Date; @Entity
@Table(name = "user") // name属性值会报错,不用担心
public class User implements Serializable {
private Integer id;
private String username;
private String password;
private Date reg_time; public User() {
} public User(Integer id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
} public User(Integer id, String username, String password, Date reg_time) {
this(id, username, password);
this.reg_time = reg_time;
} @Id // 该注解定义实体标识符的属性
@GeneratedValue(generator = "increment", strategy = GenerationType.AUTO) // 两个主键生成策略,指示Hibernate如何生成
@GenericGenerator(name = "increment", strategy = "increment")
public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} @Temporal(TemporalType.DATE) // 可以对时间类型的数据注解JPA提供的枚举时间类型 DATE, TIME, TIMESTAMP;
@Column(name = "reg_time") // 标注类属性对应的表字段名称
public Date getReg_time() {
return reg_time;
} public void setReg_time(Date reg_time) {
this.reg_time = reg_time;
} @Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
当然Hibernate核心配置文件还是需要编写的
映射配置标签改为class设置即可:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 基本链接参数 -->
<property name="connection.url">jdbc:mysql://IP-Address:Port/hibernate?serverTimezone=Asia/Shanghai</property>
<property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="connection.username">Username</property>
<property name="connection.password">Password</property> <property name="dialect">org.hibernate.dialect.MySQL57Dialect</property> <!-- 数据库版本方言 -->
<property name="show_sql">true</property> <!-- 是否让控制台输出SQL语句 -->
<property name="format_sql">true</property> <!-- 控制台输出的SQL格式化 -->
<property name="hbm2ddl.auto">update</property> <!-- 数据库表的生成策略 --> <mapping resource="hibernate/mapping/News.hbm.xml" /> <!-- 实体类映射XML路径 -->
<mapping class="cn.zeal4j.domain.User" /> <!-- 使用注解的配置方式 -->
</session-factory> </hibernate-configuration>
打印输出:
Hibernate:
create table user (
id integer not null,
password varchar(255),
reg_time date,
username varchar(255),
primary key (id)
) engine=InnoDB
九月 23, 2020 10:32:18 下午 org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator initiateService
INFO: HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
Hibernate:
select
max(id)
from
user
user id -> 1
Hibernate:
insert
into
user
(password, reg_time, username, id)
values
(?, ?, ?, ?)
查看数据库:

二、关联关系注解:
发现了Lombok堆溢出的错误是由@Data注解造成的,改用@Setter @Getter注解则不会报错
实体类A
package cn.zeal4j.domain; import lombok.*;
import org.hibernate.annotations.GenericGenerator; import javax.persistence.*;
import java.io.Serializable; /**
* @author Administrator
* @file Hibernate-Tutorial
* @create 2020 09 27 10:13
*/
@Entity
@Table(name = "a")
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class EntityA implements Serializable {
private static final long serialVersionUID = -2888634867818013382L;
@Id
@GeneratedValue(generator = "increment", strategy = GenerationType.AUTO)
@GenericGenerator(name = "increment", strategy = "increment")
private Integer id;
private String info; @ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "b_id")
private EntityB entityB;
}
实体类B
package cn.zeal4j.domain; import lombok.*;
import org.hibernate.annotations.GenericGenerator; import javax.persistence.*;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set; /**
* @author Administrator
* @file Hibernate-Tutorial
* @create 2020 09 27 10:13
*/
@Entity
@Table(name = "b")
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class EntityB implements Serializable {
private static final long serialVersionUID = -1308014214512822794L;
@Id
@GeneratedValue(generator = "increment", strategy = GenerationType.AUTO)
@GenericGenerator(name = "increment", strategy = "increment")
private Integer id;
private String info; @OneToMany(mappedBy = "entityB", cascade = {CascadeType.ALL})
private Set<EntityA> entityASet = new HashSet<>();
}
执行的SQL语句
Hibernate:
create table a (
id integer not null,
info varchar(255),
b_id integer,
primary key (id)
) engine=InnoDB
Hibernate:
create table b (
id integer not null,
info varchar(255),
primary key (id)
) engine=InnoDB
Hibernate:
alter table a
add constraint FKh2icx52jhor7siuxpgqqki6bi
foreign key (b_id)
references b (id)
九月 27, 2020 10:34:40 上午 org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator initiateService
INFO: HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
Hibernate:
select
max(id)
from
b
Hibernate:
select
max(id)
from
a
Hibernate:
insert
into
b
(info, id)
values
(?, ?)
Hibernate:
insert
into
a
(b_id, info, id)
values
(?, ?, ?)
Process finished with exit code 0
【Hibernate】Re03 注解方式实现的更多相关文章
- hibernate annotation注解方式来处理映射关系
在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,我在试了这两种方式 ...
- Hibernate基于注解方式配置来实现实体和数据库之间存在某种映射关系
实体和数据库之间存在某种映射关系,hibernate根据这种映射关系完成数据的存取.在程序中这种映射关系由映射文件(*.hbm.xml)或者java注解(@)定义. 本文以java注解的形式总结映射关 ...
- Hibernate基于注解方式的各种映射全面总结
1. 使用Hibernate Annotation来做对象关系映射 1) 添加必须包: hibernate-jpa-2.0-api-1.0.0.Final.jar 2) 在实体类中添加JPA的标准注解 ...
- 2.2、Hibernate用注解方式实现一对多、多对多关系
一.一对多关系 1.在上一篇日志中用.xml配置文件项目基础上,再往lib目录先添加一个包-hibernate-jpa-2.0-api-1.0.0.Final.jar 2.新建一个com.st.bea ...
- Hibernate @Formula 注解方式
1.Formula的作用 Formula的作用就是用一个查询语句动态的生成一个类的属性 就是一条select count(*)...构成的虚拟列,而不是存储在数据库里的一个字段.用比较标准的说法就是: ...
- Hibernate用注解方式实现一对多、多对多关系
一.一对多关系 1.在上一篇日志中用.xml配置文件项目基础上,再往lib目录先添加一个包-hibernate-jpa-2.0-api-1.0.0.Final.jar 2.新建一个com.st.bea ...
- hibernate 用注解方式生成uuid方法
//配置uuid,本来jpa是不支持uuid的,但借用hibernate的方法可以实现. @GeneratedValue(generator = "uuid") @Generate ...
- hibernate注解方式来处理映射关系
在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,我在试了这两种方式 ...
- 【hibernate/JPA】注解方式实现 复合主键【spring boot】
1>hibernate/JPA实现复合主键的思路:是将所有的主键属性封装在一个主键类中,提供给需要复合主键的实体类使用. 2>主键类的几点要求: . 使用复合主键的实体类必须实现Seria ...
- hibernate中.hbm.xml和注解方式自动生成数据表的简单实例(由新手小白编写,仅适用新手小白)
绝逼新手小白,so 请大神指点! 如果真的错的太多,错的太离谱,错的误导了其他小伙伴,还望大神请勿喷,大神请担待,大神请高抬贵嘴......谢谢. 好了,正题 刚接触ssh,今天在搞使用.hbm.xm ...
随机推荐
- CF1836
A.Destroyer 开个桶记录个数,看满不满足单调不上升即可. B.Astrophysicists 辛辛苦苦写了这么久的文章就没了????烦死了. 自己做 Virtual Contest 的时候这 ...
- logback日志格式模板,基于TraceId搜索完整的请求链路日志
logback日志格式模板,基于TraceId搜索完整的请求链路日志 日志打印格式:(可以基于TraceId:4d484c2a110eae9d来搜索完整的请求链路日志2023-08-28 15:06: ...
- 3年Java阿里跳字节的面试心得总结
中厂->阿里->字节,成都->杭州->成都 系列文章目录和关于我 0.前言 笔者在不足两年经验的时候从成都一家金融科技中厂跳槽到杭州阿里淘天集团,又于今年5月份从杭州淘天跳槽到 ...
- Spring之WebMvcConfigurationSupport
WebMvcConfigurationSupport是mvc的核心配置.开发spring,了解和掌握这个是必须的. 为了简约篇幅,本文把"WebMvcConfigurationSupport ...
- 使用 GPU 进行 Lightmap 烘焙 - 简单 demo
作者:i_dovelemon 日期:2024-06-16 主题:Lightmap, PathTracer, Compute Shader 引言 一直以来,我都对离线 bake lightmap 操作很 ...
- Vim的移动大法
Vim的移动大法 移动光标的按键 "h" 向左移动 "j"向下移动 "k"向上移动 "l"向右移动 在单词之间移动 注: ...
- 3.8折钜惠,瑞芯微RK3568J国产工业评估板“限时折扣”!
- 嵌入式工业开发板基础测试手册——基于NXP iMX6ULL开发板(1)
前 言 本文档适用开发环境: Windows开发环境:Windows 7 64bit.Windows 10 64bit 虚拟机:VMware15.1.0 Linux开发环境:Ubuntu18.04.4 ...
- Codeforces Global Round 26 A~C2
惹啊啊啊啊,这场做得我发昏,最近总感觉不在状态,但还是再在冲击1600-1800的题目. A. Strange Splitting ---------------------------------题 ...
- Me-and-My-Girlfriend-1靶机渗透流程
Me-and-My-Girlfriend-1 靶机下载 Description: This VM tells us that there are a couple of lovers namely A ...