【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 ...
随机推荐
- epoll使用与原理
使用要点 边缘模式(ET)与水平模式(LT)区别 下面内容来自linux man page The epoll event distribution interface is able to beha ...
- spring项目中读取resources下的文件
spring项目中读取resources下的文件 我们都知道,spring项目经过maven打包后,可以打成jar包或可解压的war包 a. war包是需要外置的web容器去运行的,是需要先解压的 b ...
- Lakehouse 还是 Warehouse?(2/2).md
这篇博文包括 Onehouse 首席执行官 Vinoth Chandar 于 2022 年 3 月在奥斯汀数据委员会发表的重要演讲的后半部分.本文是第 2 部分,比较了架构的功能和性价比特征.最后,它 ...
- 揭秘In-Context Learning(ICL):大型语言模型如何通过上下文学习实现少样本高效推理[示例设计、ICL机制详解]
揭秘In-Context Learning(ICL):大型语言模型如何通过上下文学习实现少样本高效推理[示例设计.ICL机制详解] 自GPT-3首次提出了In-Context Learning(ICL ...
- 如何使用csproj构建C#源代码组件NuGet包?
一般我们构建传统的NuGet包,都是打包和分发dll程序集文件. 至于打包和分发C#源代码文件的做法,比较少见. 那么这种打包源代码文件的做法,有什么优点和缺点呢? 优点: 方便阅读源代码. 方便断点 ...
- C# 语言在AGI 赛道上能做什么
自从2022年11月OpenAI正式对外发布ChatGPT依赖,AGI 这条赛道上就挤满了重量级的选手,各大头部公司纷纷下场布局.原本就在机器学习.深度学习领域占据No.1的Python语言更是继续稳 ...
- OpenTelemetry 深度定制:跨服务追踪的实战技巧
背景 在上一篇<从 Dapper 到 OpenTelemetry:分布式追踪的演进之旅>中在最后提到在做一些 Trace 的定制开发. 到现在差不多算是完成了,可以和大家分享一下. 我们的 ...
- 2024年,AI驱动测试管理工具会有哪些发展前景呢?
随着人工智能技术的日新月异,2024年的测试管理工具将迎来全新的发展机遇.AI赋能将助力测试管理工具实现前所未有的智能化升级,为软件研发团队带来革命性的变革. 一.什么是AI? 人工智能(AI)是一种 ...
- MSSQL慢查询查询与统计
查询MSSQL慢查询: SELECT TOP 20 TEXT AS 'SQL Statement',last_execution_time AS 'Last Execution Time' ,(tot ...
- python3 安装pymssql失败 pip3 install pymssql
python3 安装pymssql失败 报错信息: AttributeError: module 'platform' has no attribute 'linux_distribution' 解决 ...