【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 ...
随机推荐
- Mysql 使用 group by 不对 null 做分组
在项目开发查询数据需要将相同的数据做合并处理,但是字段为null,不做合并. 创建表以及添加数据 create table t_student( `id` int not null primary k ...
- kettle从入门到精通 第四十课 kettle 增量同步(分钟/小时级)
1.上一课我们学习了在数据量大的情况下的分页全量同步示例,本次我们一起学习下kettle 增量全量同步.有些业务场景不需要实时数据,比如每N分钟抽取一次数据等. 2.kettle增量全量同步示例依 ...
- kettle从入门到精通 第二十四课 kettle 部署生产常用命令
一.设置KETTLE_HOME环境变量 假设kettle软件目录为/xxx/data-integration vi ~/.bash_profile export KETTLE_HOME=/xxx/da ...
- INFINI Labs 产品更新 | Agent 全新重构,优化指标采集,支持集中配置管理,支持动态下发等功能
INFINI Labs 产品又更新啦~ 本次更新主要有 Agent.Console.Loadgen 等产品,其中 Agent 进行全新重构升级,新版限制了 CPU 资源消耗,优化了内存,相比旧版内存使 ...
- C#.NET 简单使用log4net
1.nuget 中安装log4net 2.添加一个配置文件"log4net2.config",内容如下: <?xml version="1.0" enco ...
- 【IEEE 出版】 第三届能源与电力系统国际学术会议 (ICEEPS 2024)
[连续2届会后4-5个月EI检索,检索稳定!特邀院士.Fellow 报告!]第三届能源与电力系统国际学术会议 (ICEEPS 2024)以"创造更加柔性.智能的能源电力系统"为主题 ...
- poj1338 ugly number 题解 打表
类似的题目有HDU1058 humble number(翻译下来都是丑陋的数字). Description Ugly numbers are numbers whose only prime fact ...
- spring多数据源配置笔记
本文阐述使用多数据源的额场景,以及如何使用springboot的配置多数据源. 关于后者,主要是直接引用其它博文:https://blog.csdn.net/u012060033/article/de ...
- 使用Redis+SpringBoot实现定时任务测试
Redis实现定时任务是基于对RedisKey值的监控 具体代码实现: 代码GitHub地址:https://github.com/Tom-shushu/Project 建一个SpringBoot项目 ...
- OpenSSL静态库交叉编译
一.编译前环境准备 使用的内核:4.15.0-118-generic(命令:uname -r可以查看) 交叉编译器:aarch64-linux-gnu-gcc openssl源码:openssl-1. ...