搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
羊村懒王
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
java二叉树
2
ATP-EMTP中的LCC模块电缆线路阅读bergeron模型与JMarti模型数据卡
3
把表从Access导出到Sql Server
4
蓝桥杯第八届决赛 c++ B组 题目及个人题解_蓝桥杯八届国赛试题 csdn c++b组
5
回溯算法练习day.3
6
MAC 本地搭建Dify环境_dify中文版mac部署
7
人工智能AI AIGC 之大语言模型训练技术及系统综述_深度学习:ai大型语言模型的深度学习策略
8
在githhub上创建个人展示主页的方法【2022年版】_github个人主页链接在哪
9
PS直接免费使用Stable Diffusion,这款插件简直是设计师的福音_stable diffusion 照片转白描
10
uniapp开发,打包成H5部署到服务器_uniapph5打包部署服务器
当前位置:
article
> 正文
hibernate annotation_hibernate.annotation
作者:羊村懒王 | 2024-05-03 09:52:37
赞
踩
hibernate.annotation
http://shenzhenchufa.blog.51cto.com/730213/291787
hibernate Annotation标签的使用:
[1]
1.带注释的持久性类也是普通 POJO,它们只是具备了持久性注释的普通 POJO 。
2.事实上,您既可以保持字段的持久性(注释写在成员变量之上),也可以保持属性(注释写在getter方法之上)的持久性。
3.常用的hibernate annotation标签如下:
@Entity
--注释声明该类为持久类。将一个Javabean类声明为一个实体的数据库表映射类,最好实现序列化.此时,默认情况下,所有的类属性都为映射到数据表的持久性字段.若在类中,添加另外属性,而非映射来数据库的,要用下面的Transient来注解.
@Table
(name=
"promotion_info"
) --持久性映射的表(表名="promotion_info).@Table是类一级的注解,定义在@Entity下,为实体bean映射表,目录和schema的名字,
默认为实体bean的类名,不带包名.
@Id
--注释可以表明哪种属性是该类中的独特标识符(即相当于数据表的主键)。
@GeneratedValue
--定义自动增长的主键的生成策略.
@Transient
--将忽略这些字段和属性,不用持久化到数据库.适用于,在当前的持久类中,某些属性不是用于映射到数据表,而是用于其它的业务逻辑需要,这时,须将这些属性进行transient的注解.否则系统会因映射不到数据表相应字段而出错.
@Temporal
(TemporalType.TIMESTAMP)--声明时间格式
@Enumerated
--声明枚举
@Version
--声明添加对乐观锁定的支持
@OneToOne
--可以建立实体bean之间的一对一的关联
@OneToMany
--可以建立实体bean之间的一对多的关联
@ManyToOne
--可以建立实体bean之间的多对一的关联
@ManyToMany
--可以建立实体bean之间的多对多的关联
@Formula
--一个SQL表达式,这种属性是只读的,不在数据库生成属性(可以使用sum、average、max等)
@OrderBy
--Many端某个字段排序(List)
1.2
Hibernate 能够出色地自动生成主键。Hibernate/EBJ 3 注释也可以为主键的自动生成提供丰富的支持,允许实现各种策略。
其生成规则由@GeneratedValue设定的.这里的@id和@GeneratedValue都是JPA的标准用法, JPA提供四种标准用法,由@GeneratedValue的源代码可以明显看出.
JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO.
TABLE:使用一个特定的数据库表格来保存主键。
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
IDENTITY:主键由数据库自动生成(主要是自动增长型)
AUTO:主键由程序控制。
在指定主键时,如果不指定主键生成策略,默认为AUTO。
@Id
相当于
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
identity:
使用SQL Server 和 MySQL 的自增字段,这个方法不能放到 Oracle 中,Oracle 不支持自增字段,要设定sequence(MySQL 和 SQL Server 中很常用)。
Oracle就要采用sequence了.
同时,也可采用uuid,native等其它策略.(相关用法,上网查询)
[2]
第一个持久性类
@Entity
@Table(name=
"T_MODEL_PLANE"
)
public
class
ModelPlane
implements
Serializable {
@Id
@Column(name=
"PLANE_ID"
)
@GeneratedValue(strategy=GenerationType.AUTO)
//注解于属性中
/*
对于oracle想使用各自的Sequence,设置如下:
@GeneratedValue(strategy = GenerationType.AUTO,generator="PROMOTION_SEQ")
@SequenceGenerator(name="PROMOTION_SEQ",sequenceName="PROMOTION_SEQ")
另外:
对于自动增长后,在数据表中的相应字段,要设置字段为auto_increment.
*/
private
Long id;
private
String name;
//注解写于getter方法之上.请见下.
//DATE - java.sql.Date
//TIME - java.sql.Time
//TIMESTAMP - java.sql.Timestamp
@Temporal(TemporalType.TIMESTAMP)
@Column(name=
"start_time"
)
private
Date startTime;
//显示0 隐藏1
public
static
enum
DisplayType {显示,隐藏}
@Enumerated(value = EnumType.ORDINAL)
//ORDINAL序数
private
DisplayType displayType = DisplayType.显示;
//1.sql语句中的字段和表名都应该和数据库相应,而不是类中的字段,
//若带有参数如la.id= id,这个=id才是类中属性
//2.操作字段一定要用别名
@Formula(select COUNT(la.id) from largess la)
private
int
count;
//注解于方法中
@Column(name=
"PLANE_ID"
, length=80, nullable=
true
)
//较详细定义
public
String getName() {
return
name;
}
public
void
setName(String name) {
this
.name = name;
}
其它的setter,getter省略......
}
该内容将映射到下表中:
CREATE TABLE T_MODEL_PLANE
(
PLANE_ID
long
,
PLANE_NAME varchar
其它字段省略...
)
默认情况下,Hibernate 会将持久类以匹配的名称映射到表和字段中。例如,下例中,若不用注解,则会映射到如下一表中:
CREATE TABLE MODELPLANE
(
ID long,
NAME varchar
其它字段省略...
)
[3]
一对多注解:
1.
在一对多注解中,会用到:
"一"方:
@OneToMany --> mappedBy:"多"方的关联属性
(被控方)
"多"方:
@ManyToOne --> @JoinColumn,"多"方定义的外键字段.
如数据表定义外键如下:
FOREIGN KEY (classid) REFERENCES classes(id)
则:
@JoinColumn(name=
"classid"
)
2.
在双向关联中,有且仅有一端作为主体(owner)端存在:主体端负责维护联接列(即更新),对于不需要维护这种关系的从表则通过mappedNy属性进行声明。mappedBy的值指向另一主体的关联属性。例子中,mappedBy的值为classes。
附加说明:
mappedBy相当于过去的inverse="true".
inverse=false的side(side其实是指inverse=false所位于的class元素)端有责任维护关系,而inverse=true端无须维护这些关系。
3.
cascade与fetch使用说明:
Cascade
CascadeType.PERSIST (级联新建)
CascadeType.REMOVE (级联删除)
CascadeType.REFRESH (级联刷新)
CascadeType.MERGE (级联更新)中选择一个或多个。
CascadeType.ALL
fetch属性:
关联关系获取方式,即是否采用延时加载。
LAZY(默认值)采用延时加载,查询数据时,不一起查询关联对象的数据。而是当访问关联对象时(如:getStudnets()时)才触发相应的查询操作,获取关联对象数据。
EAGER:是在查询数据时,也直接一起获取关联对象的数据。
package
oneToMany;
import
java.util.Set;
import
javax.persistence.*;
/*
注意导入时,是导入:import javax.persistence.*;
非导入org.hibernate的相关类:import org.hibernate.annotations.Entity;
*/
@Entity
@Table(name=
"classes"
)
public
class
Classes
implements
Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private
int
id;
private
String name;
@OneToMany(cascade=CascadeType.ALL,mappedBy=
"classes"
)
private
Set<Student> students;
//getter,setter省略
}
package
oneToMany;
import
javax.persistence.*;
@Entity
@Table(name=
"student"
)
public
class
Student
implements
Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private
int
sid;
private
String sname;
//若有多个cascade,可以是:{CascadeType.PERSIST,CascadeType.MERGE}
@ManyToOne(cascade={CascadeType.ALL})
@JoinColumn(name=
"classid"
)
//student类中对应外键的属性:classid
private
Classes classes;
//getter,setter省略
}
public
class
TestOneToMany {
/*
CREATE TABLE student ( --要定义外键!!!!!!!
`sid` double NOT NULL auto_increment,
`classid` double NULL,
`sname` varchar(255) NOT NULL,
PRIMARY KEY (sid),
INDEX par_ind (classid),
FOREIGN KEY (classid) REFERENCES classes(id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB
*/
public
static
void
main(String[] args)
throws
SQLException
{
try
{
SessionFactory sf =
new
AnnotationConfiguration().configure().buildSessionFactory();
Session session=sf.openSession();
Transaction tx=session.beginTransaction();
/*
因为mappedBy是定义在classes中,即classes类不负责维护级联关系.即维护者是student.所以,
1.要将clsses的数据,赋给student,即用student的setClasses()方法去捆定class数据;
2.在进行数据插入/更新session.save()/session.update()时,最后操作的是student.
*/
Classes classes=
new
Classes();
classes.setName(
"access"
);
Student st1=
new
Student();
st1.setSname(
"jason"
);
st1.setClasses(classes);
session.save(st1);
Student st2=
new
Student();
st2.setSname(
"hwj"
);
st2.setClasses(classes);
session.save(st2);
tx.commit();
/*
输出如下:
Hibernate: insert into classes (name) values (?)
Hibernate: insert into student (classid, sname) values (?, ?)
Hibernate: insert into student (classid, sname) values (?, ?)
*/
/*
因为一端维护关系另一端不维护关系的原因,我们必须注意避免在应用中用不维护关系的类(class)建立关系,因为这样建立的关系是不会在数据库中存储的。
如上的代码倒过来,则插入时,student的外键值为空.如下:
*/
// Student st1=new Student();
// st1.setSname("jason");
// session.save(st1);
//
// Student st2=new Student();
// st2.setSname("hwj");
// session.save(st2);
//
// Set<Student> students=new HashSet<Student>();
// students.add(st1);
// students.add(st2);
//
// Classes classes=new Classes();
// classes.setName("access");
// classes.setStudents(students);
// session.save(classes);
/*
输出如下:
Hibernate: insert into student (classid, sname) values (?, ?)
Hibernate: insert into student (classid, sname) values (?, ?)
Hibernate: insert into classes (name) values (?)
*/
}
catch
(HibernateException e)
{
e.printStackTrace();
}
}
}
[4]
多对多注解:
在多对多注解中,双方都采用@ManyToMany.
其中被控方,像一对多注解中设置一样,也要设置mappedBy.
其中主控方,不像一对多注解那样,采用@joinColumn,而是采用@joinTable.如下:
@JoinTable(name="j_student_course" ,joinColumns={@JoinColumn(name="sid")},inverseJoinColumns={@JoinColumn(name="cid")})
其中,
如上所说,mappedBy,相当于inverse="true".所以,在@joinTable中的inverseJoinColumns中定义的字段为mappedBy所在类的主键.
joinColumns定义的字段,就是当前类的主键.
@Entity
@Table(name=
"jcourse"
)
public
class
Jcourse {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private
int
cid;
private
String cname;
@ManyToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE},fetch=FetchType.LAZY ,mappedBy=
"courses"
)
private
Set<Jstudent> students;
//setter,getter省略....
}
@Entity
@Table(name=
"jstudent"
)
public
class
Jstudent {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private
int
sid;
private
String sname;
@ManyToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE},fetch=FetchType.EAGER)
//inverseJoinColumns中对应的id为以下属性course的对应id.
@JoinTable(name=
"j_student_course"
,joinColumns={@JoinColumn(name=
"sid"
)},inverseJoinColumns={@JoinColumn(name=
"cid"
)})
private
Set<Jcourse> courses;
//setter,getter省略....
}
public
class
Test {
public
static
void
main(String[] args) {
try
{
SessionFactory sf =
new
AnnotationConfiguration().configure().buildSessionFactory();
Session session=sf.openSession();
Transaction tx=session.beginTransaction();
Jcourse course=
new
Jcourse();
course.setCname(
"jason-english"
);
session.save(course);
//先各自保存.
Jcourse course2=
new
Jcourse();
course2.setCname(
"herry-english"
);
session.save(course2);
Set<Jcourse> courses=
new
HashSet<Jcourse>();
courses.add(course);
courses.add(course2);
Jstudent student=
new
Jstudent();
student.setSname(
"jason"
);
student.setCourses(courses);
session.save(student);
// 要用非mapby定义的类(studet)来作为主者(会控制级联关系),一对多,多对一也一样道理.
//可以尝试反过来.
tx.commit();
}
catch
(HibernateException e)
{
e.printStackTrace();
}
}
}
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/羊村懒王/article/detail/529018
推荐阅读
article
Vmware
提示以独占方式锁定此
配置文件
失败
_
无法
启动
dhcp1068
...
**尝试如下:**ctrl +alt+delete通过任务管理器结束所有VMware的进程后再次
启动
会出现报错错误106...
赞
踩
article
基于
stm32
智能家居
控制
物
联网
嵌入式
软硬件
开发
单片机
毕业源码案例设计...
(1)硬件端1. 使用APP开锁,这种开锁方式门将不会自动关门,需要APP经行手动关锁2. 使用RFID的方式进行开锁,...
赞
踩
article
平面
原型
设计工具-
Adobe
AI
入门
_
原型
图
ai
...
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插...
赞
踩
article
如何做
慢
查询
优化
?
_
优化
慢
查询
...
这个问题可以说是一个高频问题,总是被问到,今天来总结下这个问题。
_
优化
慢
查询
优化
慢
查询
...
赞
踩
article
新版
Github
查看
历史提交
commit
记录_
github
查看
提交记录...
Github
查看
历史提交和修改记录,
Github
查看
提交记录,
Github
查看
commit
记录_
github
查看
提交...
赞
踩
article
【
Git
】 取消上
一次
commit
或
push
_
git
撤回上
一次
提交
...
这会创建一个新的
提交
来撤消
提交
之前的更改。在命令行中输入该命令后,你需要编辑撤消的
提交
信息,以便
Git
创建一个新的提...
赞
踩
article
【
全栈
开发技术
路线
】_
web
全栈
学习
路线
...
需求分析、设计规划、数据库设计、前端开发、后端开发、测试、服务部署、后期维护,全部一个人搞定。来源:arry老师知乎We...
赞
踩
article
Brew 安装
MySQL
后,将
配置文件
my
.
cnf
添加到/etc/
my
.
cnf
后启动服务报错(Th...
brew
install
my
sql
后并没有进行
my
.
cnf
配置,所有新建了个
my
.
cnf
文件将以前的配置项都添加到了这...
赞
踩
article
ubuntu
无法解析域名“cn.
archive
.
ubuntu
.com“,修改
DNS
配置_
127.0
....
系统:Ubuntu18.04错误:1 http://cn.
archive
.
ubuntu
.com/
ubuntu
focal...
赞
踩
article
CSV
文件处理——
转
为
数组
_
csv
转
数组
...
1.与
数组
进行
转
换初始示范表如下:1.1
CSV
文件
转
化为
数组
import numpy as npmydata = np...
赞
踩
article
DDS
方波
信号
发生器
的设计与
FPGA
实现
_dds原理产生
方波
信号
...
数字频率合成技术(
DDS
)被广泛用于
信号
发生器
的设计中,由于其
实现
简单、高精度和灵活性强等特点。本文将介绍如何使用FPG...
赞
踩
article
2023年
以太
坊
测试
网
水龙头
整理(包含
Goerli
和
Sepolia
)_
以太
坊
水龙头
...
Ethereum
测试
网是对
以太
坊主网生态环境的模拟,开发者可以
测试
网上面部署协议和智能合约。
Goerli
测试
网:目前最主...
赞
踩
article
mac
下使用
brew
安装
mysql
_
mac
如何
安装
包的命令
mysql
binlog...
步骤:一、
安装
home
brew
二、
安装
mysql
三、配置自启动四、修改
mysql
密码五、创建my.cnf配置文件一、
安装
...
赞
踩
article
Mac(A1)下
Homebrew
的
安装
与配置_
homwbrew
在
opt
/
homebrew
实际
安装
...
概述
Homebrew
是一款包管理工具,目前支持macOS和linux系统。主要有四个部分组成: brew、homebre...
赞
踩
article
DDS
信号
发生器
基于
FPGA
仿真
,
Verilog
语言
实现
,可
实现
正弦波、方波、锯齿波、三角波及其线性...
其次,我们来讨论一下
DDS
信号
发生器
在
FPGA
仿真
中的应用。在
DDS
信号
发生器
的
仿真
过程中,可以使用
FPGA
来
实现
相位累...
赞
踩
article
维修
家政
按摩到家
上门
小
程序
开源版开发...
值得一提的是,
上门
费用管理系统非常灵活,支持多种计费方式,如按距离计费、白天与晚间不同费率等,满足了各种复杂场景的需求。...
赞
踩
article
App
Store
新
定价
机制
- 2023最新版_iap
苹果
对账
美元
...
本文介绍了
苹果
App
Store
的新
定价
机制
,是
App
Store
在 15 周年之际推出的最重要价格升级。文章通...
赞
踩
article
电赛专题 |国一
作品
_
线路
负载
及
故障
检测
装置
...
有幸邀请到了在2019大学生电子设计大赛的获奖优秀队员为本公众号投稿,将分几次推文为大家介绍几只优秀队伍的
作品
。本次推文...
赞
踩
article
数据结构
之
---
c
语言
实现
线性
表
的顺序
表
_将
数据结构
的顺序
表
改为
c
语言
...
数据结构
之
---
c
语言
实现
线性
表
_将
数据结构
的顺序
表
改为
c
语言
将
数据结构
的顺序
表
改为
c
语言
//...
赞
踩
article
Edge
在保留
数据
的情况下
退出
微软
账户
登录
_
edge
浏览器
退出
登录
微软
账户
...
现在,越来越多的人使用
Edge
浏览器
来进行网络浏览,但有时候您可能需要
退出
微软
账户
登录
。问题是,当您
退出
时,您是否会失去...
赞
踩
相关标签
智能家居
物联网
单片机
嵌入式硬件
stm32
硬件工程
数据库
github
git
c5全栈
MySQL
PID
my.cnf
ubuntu
python
fpga开发
matlab
区块链
linux
程序人生
微信小程序
小程序
ios
xcode