Menu

  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • Assembly
      • Ruby
      • Perl
      • Lua
      • Rust
      • XML
      • Network
      • IoT
      • GIS
      • Algorithm
      • AI
      • Math
      • RE
      • Graphic
    • OS
      • Linux
      • Windows
      • Mac OS X
    • BigData
    • Database
      • MySQL
      • Oracle
    • Mobile
      • Android
      • IOS
    • Web
      • HTML
      • CSS
  • Life
    • Cooking
    • Travel
    • Gardening
  • Gallery
  • Video
  • Music
  • Essay
  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • Assembly
      • Ruby
      • Perl
      • Lua
      • Rust
      • XML
      • Network
      • IoT
      • GIS
      • Algorithm
      • AI
      • Math
      • RE
      • Graphic
    • OS
      • Linux
      • Windows
      • Mac OS X
    • BigData
    • Database
      • MySQL
      • Oracle
    • Mobile
      • Android
      • IOS
    • Web
      • HTML
      • CSS
  • Life
    • Cooking
    • Travel
    • Gardening
  • Gallery
  • Video
  • Music
  • Essay

Hibernate基于注解的配置样例

24
Dec
2010

Hibernate基于注解的配置样例

By Alex
/ in Java
/ tags Hibernate, 配置文件
0 Comments
实体类上的常用注解
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
@Entity ( name = "ChristmasTree" )
@Table ( name = "T_CRISMS_TREE" )
//给自动生成的表添加注释
@org.hibernate.annotations.Table ( appliesTo = "T_CRISMS_TREE", comment = "圣诞树" )
@Cacheable  //JPA注解,表示该类型的实体支持缓存
//启用二级缓存时有意义,指定Hibernate缓存策略、存放区域
@Cache ( usage = CacheConcurrencyStrategy.READ_WRITE, region = "entityCache" )
public class ChristmasTree
{
    //集合属性的缓存策略必须单独配置
    @Cache ( usage = CacheConcurrencyStrategy.READ_WRITE, region = "entityCache" )
    private List branches;
}

使用注解方式进行对象-数据库映射时,应当以JPA注解为主,仅Hibernate特有的功能则使用其私有的注解类。

简单主键和简单属性映射
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//简单的主键映射
@Id  //该注解指明此实体的标识符属性,对应了关系型数据库的主键
@Column ( name = "ID", columnDefinition = "int(11) comment '主键'" )
private Integer id;
 
//UUID方式的主键生成器配置,其它任何自定义的主键生成器可以依样扩展
@Id
@Column ( name = "ID", columnDefinition = "varchar(36) comment '主键,36位UUID'" )
@GeneratedValue ( generator = "uuid" )
@GenericGenerator ( name = "uuid", strategy = "org.hibernate.id.UUIDGenerator" )
private String            id;
 
//可以指定普通属性的延迟加载
@Basic ( fetch = FetchType.EAGER, optional = true )
@Column ( name = "BUILD_COST", columnDefinition = "decimal(10,2) comment '建造费用'" )
private BigDecimal buildCost;
 
//时间映射
//只能用于java.util.Date或者java.util.Calendar,用于表示日期、时间或者时间戳
@Temporal ( TemporalType.TIMESTAMP )
@Column ( name = "BUILD_TIME", columnDefinition = "datetime comment '建造时间'" )
private Date buildTime;
 
//大字段映射
@Lob
@Column ( name = "REMARK", columnDefinition = "longtext comment '圣诞树备注信息'" )
private String remark;
 
//枚举类型映射
@Enumerated ( EnumType.ORDINAL )
//根据枚举元素的声明顺序,从0开始
@Column ( name = "STATUS", columnDefinition = "tinyint comment '状态'" )
private Status status;
 
 
//乐观并发控制用列
@Version
@Column ( name = "VERSION" )
public Integer version;
复合主键映射
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//复合主键映射
@Embeddable
public class TreeId
{
    @Column ( name = "ORG_ID" )
    private Integer org;
    @Column ( name = "SEQ_ID" )
    private Integer seq;
}
//可以覆写默认映射
@EmbeddedId
@AttributeOverride ( name = "seq", column = @Column (name = "SEQ_NO" ) )
private TreeId treeId;
//复合主键中甚至可以包含实体类
@Embeddable
public class TreeId
{
    @ManyToOne
    @JoinColumn  (name = "ORG_ID", referencedColumnName="ID" )
    private Org org;
    @Column ( name = "SEQ_ID" )
    private Integer seq;
}
//也可以使用多个属性作为主键
public class ChristmasTree
{
    @Id
    @OneToOne
    @JoinColumn (name = "ORG_ID", referencedColumnName="ID" )
    private Org org;
 
    @Id
    @Column ( name = "SEQ_ID" )
    private Integer seq;
}
嵌入式(embeddable)对象映射
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//嵌入式对象映射,也叫组件映射
@Embeddable
public class Country
{
    @ManyToOne
    @JoinColumn (name = "ORG_ID", referencedColumnName="ID" )
    private Org adminOrg;
    private String name;
}
@Embeddable
public class Address implements Serializable
{
    String city;
    Country nationality; // 递归嵌入
}
@Entity
public class Person implements Serializable
{
 
    private Address homeAddress; //由于Address声明为@Embeddable,所以自动进行组件映射
    @Embedded
    @AttributeOverrides( { //进行映射覆写
        @AttributeOverride ( name = "adminOrg", column = @Column ( name = "ADMIN_ORG_ID" ) ),
        @AttributeOverride ( name = "name", column = @Column ( name = "COUNTRY_NAME" ) )
    } )
    Country bornIn;
}
 
//嵌入式对象的集合也可以被映射,注意子表不需要主键,也没有实体地位
@Embeddable
public class Address implements Comparable<Address>
{
    @Column ( name = "ZIP_CODE" )
    private Integer zip;
 
    @Column ( name = "STREET" )
    private String  street;
}
@Entity
@Table ( name = "T_PERSON" )
public class Person
{
    @Id
    private Integer      id;
 
    @ElementCollection
    @CollectionTable ( name = "T_ADDRESS", joinColumns = @JoinColumn ( name = "PERSON_ID" ) )
    //两种定义集合元素顺序的方法:
    @Sort ( type = SortType.NATURAL )
    @OrderBy ( "zip DESC" )
    private Set<Address> addresses;
}
关联映射
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
//基于主键共享的一对一关联
public class ChristmasTree
{
    @Id
    private Long id;
    @OneToOne ( cascade = CascadeType.ALL, optional = false )
    @MapsId  //共享主键
    private TreeRoot root;
}
public class TreeRoot
{
    @Id
    private Long id;
}
//基于外键的多对一关联
@ManyToOne (
    fetch = FetchType.EAGER,//默认非延迟加载
    optional = false //是否可选,如果设置为真则允许为空,默认否
)
@JoinColumn ( /*本表外键列*/
    name = "ROOM_ID",
    columnDefinition = "varchar(36) comment '所在房间'" ,
    referencedColumnName = "NOT_PK_COLUMN" //可以指定不和目标表的主键,而是其它唯一键列进行映射
)
@NotFound ( action = NotFoundAction.IGNORE ) //当对应数据找不到的时候,是否抛出异常
@OnDelete ( action = OnDeleteAction.CASCADE ) //父表ROOM的数据被删除时,在数据库级别自动级联删除当前表的相关数据
@ForeignKey (name = "FK_CRISMS_TREE_ROOM" ) //指定外键名称
private Room              room;
 
//基于映射表的多对一关联
@ManyToOne
@JoinTable (
    name = "T_M_CRISMS_TREE_ROOM",
    joinColumns = @JoinColumn ( name = "TREE_ID" ),
    inverseJoinColumns = @JoinColumn ( name = "ROOM_ID" ) )
private Room room;
//多对多关联
@ManyToMany
@JoinTable ( /*映射表*/
    name = "T_M_CRISMS_TREE_CHILD",
    joinColumns = @JoinColumn ( name = "TREE_ID" ),
    inverseJoinColumns = @JoinColumn ( name = "CHILD_ID" ) )
private Set        children;
 
//一对多映射:有序集合
@OneToMany (
    fetch = FetchType.LAZY,//延迟加载(直到第一次访问时才加载),集合默认真
    orphanRemoval = true,//是否在目标实体从集合中移除时,对其进行删除
    targetEntity = AbstractFurit.class,//目标实体,不使用泛型时,必须指定
    cascade = CascadeType.ALL //在进行各种增删改操作时,关联的目标实体是否也要进行同样的操作
)
@JoinColumn ( /*子表外键列*/name = "TREE_ID", columnDefinition = "varchar(36) comment '该水果挂在哪棵树上'" )
//集合属性可以设置(在Java中的)排序方式
@Sort ( type = SortType.NATURAL )
private SortedSet furits;               //如果不需要支持排序,可以使用Set接口
 
//一对多映射:列表
@OneToMany
@JoinColumn ( name = "TREE_ID", columnDefinition = "varchar(36) comment '该树枝是哪棵树的'" )
//子表索引列必须为整数,从0开始,不得跳跃
@IndexColumn ( name = "ORD", columnDefinition = "int(11) comment '序号'" )
@Cache ( usage = CacheConcurrencyStrategy.READ_WRITE, region = "entityCache" )
private List      branches;
 
//任意多态映射,关联目标不再同一个实体层次下
@AnyMetaDef (
    //该元数据可以在包上定义,以便重用
    name = "adminMetaDef",
    idType = "string", //目标实体的标识符类型
    metaType = "integer", //元数据列的数据类型
    metaValues = {
        @MetaValue ( value = "1", targetEntity = Child.class ),
        @MetaValue ( value = "2", targetEntity = Org.class )
    } )
@Any ( metaDef = "adminMetaDef",
       metaColumn = @Column ( name = "ADMIN_TYPE", columnDefinition = "int(11) comment '管理者类别:1孩子,2机构'" ) )
@JoinColumn ( name = "ADMIN_ID", columnDefinition = "varchar(36) comment '圣诞树主管理者'" )
private Admin             mainAdmin;
 
//任意多态集合映射
@ManyToAny ( metaDef = "adminMetaDef", metaColumn = @Column ( name = "ADMIN_TYPE" ) )
@JoinTable (
    name = "T_M_CRISMS_TREE_ADMIN", //必须使用映射表,以便指定元数据列
    joinColumns = @JoinColumn ( name = "TREE_ID" ),
    inverseJoinColumns = @JoinColumn ( name = "ADMIN_ID" ) )
private Set        admins;
继承映射
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//*** 整个实体层次使用单张表
@Entity ( name = "AbstractFurit" )
@Table ( name = "T_FURIT" )
@Inheritance ( strategy = InheritanceType.SINGLE_TABLE )
@DiscriminatorColumn ( name = "TYPE_ID", columnDefinition = "int(11) comment '水果类型'" )
public class AbstractFurit implements IFurit, Serializable
{}
@Entity ( name = "Apple" )
@DiscriminatorValue ( "1" )
public class Apple extends AbstractFurit
{}
 
//*** 公共属性放在一张表,子类中的属性放在各自单独表中
@Entity ( name = "AbstractFurit" )
@Table ( name = "T_FURIT" )
@Inheritance ( strategy = InheritanceType.JOINED )
public class AbstractFurit implements IFurit, Serializable
{
    @id
    private Integer id;
}
@Entity ( name = "Apple" )
@Table ( name = "T_APPLE" )
@PrimaryKeyJoinColumn ( name = "FURIT_ID" )
public class Apple extends AbstractFurit
{}
 
//*** 每个子类使用一张表
@Entity ( name = "AbstractFurit" )
@Inheritance ( strategy = InheritanceType.TABLE_PER_CLASS )
public class AbstractFurit implements IFurit, Serializable
{}
其它注解
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//领域驱动风格的建模时,实体的瞬时属性,必须同时使用注解和关键字
@Inject
@Transient //表示该字段不支持持久化
@JsonIgnore //结合JacksonJSON使用,忽略无业务意义的字段
private transient ServiceHelper   service; //指定transient关键字,不会在Java串行化时尝试串行化该字段
 
//公式列,可以使用SQL表达式定义一个只读的列,在数据库端完成计算
@Formula("length * height * width")
private long volume;
 
// 一个或者多个字段可以作为自然键的组成,具有惟一性非空约束
@NaturalId ( mutable = true ) //可以配置自然键是否可变
@Column ( name = "COLOR", columnDefinition = "varchar(50) comment '颜色'" )
private String color;
 
//定义一个用于继承的父类,该父类不具有实体资格,但是可以定义若干公用的映射属性
@MappedSuperclass
public class Admin
{
    @Column ( name = "NAME" )
    private String name;
}
@Entity ( name = "Child" )
//可以在上述父类的某个作为实体层次根的子类上,对属性(AttributeOverride)、关联映射(AssociationOverride)进行覆写
@AttributeOverride ( name = "name", column = @Column ( name = "CHILD_NAME" ) )
public class Child extends Admin
{}
 
//把一个实体映射到多张表上,这种映射方式支持在实体层次(例如单表/类层次)中的某个分支上使用
@SecondaryTables ( {
    @SecondaryTable ( name = "T_CRISMS_TREE_OTHER", pkJoinColumns = {
        @PrimaryKeyJoinColumn ( name = "cat_id", referencedColumnName = "id" ) }
    ),
    @SecondaryTable ( name = "T_CRISMS_TREE_OTHER_2" )
} )
public class ChristmasTree implements Serializable
{
    @Column ( table = "T_CRISMS_TREE_OTHER" ) //指定某个列存放在哪张表上
    private String otherInfo;
}
← Ubuntu下安装OpenSSH服务器和客户端
Linux内核学习笔记(二) →

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Related Posts

  • Hibernate知识集锦
  • 基于JavaConfig方式的Spring+Hibernate集成
  • Log4J2学习笔记
  • Maven原型系统
  • Bazel学习笔记

Recent Posts

  • Investigating and Solving the Issue of Failed Certificate Request with ZeroSSL and Cert-Manager
  • A Comprehensive Study of Kotlin for Java Developers
  • 背诵营笔记
  • 利用LangChain和语言模型交互
  • 享学营笔记
ABOUT ME

汪震 | Alex Wong

江苏淮安人,现居北京。目前供职于腾讯云,专注容器方向。

GitHub:gmemcc

Git:git.gmem.cc

Email:gmemjunk@gmem.cc@me.com

ABOUT GMEM

绿色记忆是我的个人网站,域名gmem.cc中G是Green的简写,MEM是Memory的简写,CC则是我的小天使彩彩名字的简写。

我在这里记录自己的工作与生活,同时和大家分享一些编程方面的知识。

GMEM HISTORY
v2.00:微风
v1.03:单车旅行
v1.02:夏日版
v1.01:未完成
v0.10:彩虹天堂
v0.01:阳光海岸
MIRROR INFO
Meta
  • Log in
  • Entries RSS
  • Comments RSS
  • WordPress.org
Recent Posts
  • Investigating and Solving the Issue of Failed Certificate Request with ZeroSSL and Cert-Manager
    In this blog post, I will walk ...
  • A Comprehensive Study of Kotlin for Java Developers
    Introduction Purpose of the Study Understanding the Mo ...
  • 背诵营笔记
    Day 1 Find Your Greatness 原文 Greatness. It’s just ...
  • 利用LangChain和语言模型交互
    LangChain是什么 从名字上可以看出来,LangChain可以用来构建自然语言处理能力的链条。它是一个库 ...
  • 享学营笔记
    Unit 1 At home Lesson 1 In the ...
  • K8S集群跨云迁移
    要将K8S集群从一个云服务商迁移到另外一个,需要解决以下问题: 各种K8S资源的迁移 工作负载所挂载的数 ...
  • Terraform快速参考
    简介 Terraform用于实现基础设施即代码(infrastructure as code)—— 通过代码( ...
  • 草缸2021
    经过四个多月的努力,我的小小荷兰景到达极致了状态。

  • 编写Kubernetes风格的APIServer
    背景 前段时间接到一个需求做一个工具,工具将在K8S中运行。需求很适合用控制器模式实现,很自然的就基于kube ...
  • 记录一次KeyDB缓慢的定位过程
    环境说明 运行环境 这个问题出现在一套搭建在虚拟机上的Kubernetes 1.18集群上。集群有三个节点: ...
  • eBPF学习笔记
    简介 BPF,即Berkeley Packet Filter,是一个古老的网络封包过滤机制。它允许从用户空间注 ...
  • IPVS模式下ClusterIP泄露宿主机端口的问题
    问题 在一个启用了IPVS模式kube-proxy的K8S集群中,运行着一个Docker Registry服务 ...
  • 念爷爷
      今天是爷爷的头七,十二月七日、阴历十月廿三中午,老人家与世长辞。   九月初,回家看望刚动完手术的爸爸,发

  • 6 杨梅坑

  • liuhuashan
    深圳人才公园的网红景点 —— 流花山

  • 1 2020年10月拈花湾

  • 内核缺陷触发的NodePort服务63秒延迟问题
    现象 我们有一个新创建的TKE 1.3.0集群,使用基于Galaxy + Flannel(VXLAN模式)的容 ...
  • Galaxy学习笔记
    简介 Galaxy是TKEStack的一个网络组件,支持为TKE集群提供Overlay/Underlay容器网 ...
TOPLINKS
  • Zitahli's blue 91 people like this
  • 梦中的婚礼 64 people like this
  • 汪静好 61 people like this
  • 那年我一岁 36 people like this
  • 为了爱 28 people like this
  • 小绿彩 26 people like this
  • 杨梅坑 6 people like this
  • 亚龙湾之旅 1 people like this
  • 汪昌博 people like this
  • 彩虹姐姐的笑脸 24 people like this
  • 2013年11月香山 10 people like this
  • 2013年7月秦皇岛 6 people like this
  • 2013年6月蓟县盘山 5 people like this
  • 2013年2月梅花山 2 people like this
  • 2013年淮阴自贡迎春灯会 3 people like this
  • 2012年镇江金山游 1 people like this
  • 2012年徽杭古道 9 people like this
  • 2011年清明节后扬州行 1 people like this
  • 2008年十一云龙公园 5 people like this
  • 2008年之秋忆 7 people like this
  • 老照片 13 people like this
  • 火一样的六月 16 people like this
  • 发黄的相片 3 people like this
  • Cesium学习笔记 90 people like this
  • IntelliJ IDEA知识集锦 59 people like this
  • 基于Kurento搭建WebRTC服务器 38 people like this
  • Bazel学习笔记 37 people like this
  • PhoneGap学习笔记 32 people like this
  • NaCl学习笔记 32 people like this
  • 使用Oracle Java Mission Control监控JVM运行状态 29 people like this
  • 基于Calico的CNI 27 people like this
  • Ceph学习笔记 27 people like this
  • Three.js学习笔记 24 people like this
Tag Cloud
ActiveMQ AspectJ CDT Ceph Chrome CNI Command Cordova Coroutine CXF Cygwin DNS Docker eBPF Eclipse ExtJS F7 FAQ Groovy Hibernate HTTP IntelliJ IO编程 IPVS JacksonJSON JMS JSON JVM K8S kernel LB libvirt Linux知识 Linux编程 LOG Maven MinGW Mock Monitoring Multimedia MVC MySQL netfs Netty Nginx NIO Node.js NoSQL Oracle PDT PHP Redis RPC Scheduler ServiceMesh SNMP Spring SSL svn Tomcat TSDB Ubuntu WebGL WebRTC WebService WebSocket wxWidgets XDebug XML XPath XRM ZooKeeper 亚龙湾 单元测试 学习笔记 实时处理 并发编程 彩姐 性能剖析 性能调优 文本处理 新特性 架构模式 系统编程 网络编程 视频监控 设计模式 远程调试 配置文件 齐塔莉
Recent Comments
  • qg on Istio中的透明代理问题
  • heao on 基于本地gRPC的Go插件系统
  • 黄豆豆 on Ginkgo学习笔记
  • cloud on OpenStack学习笔记
  • 5dragoncon on Cilium学习笔记
  • Archeb on 重温iptables
  • C/C++编程:WebSocketpp(Linux + Clion + boostAsio) – 源码巴士 on 基于C/C++的WebSocket库
  • jerbin on eBPF学习笔记
  • point on Istio中的透明代理问题
  • G on Istio中的透明代理问题
  • 绿色记忆:Go语言单元测试和仿冒 on Ginkgo学习笔记
  • point on Istio中的透明代理问题
  • 【Maven】maven插件开发实战 – IT汇 on Maven插件开发
  • chenlx on eBPF学习笔记
  • Alex on eBPF学习笔记
  • CFC4N on eBPF学习笔记
  • 李运田 on 念爷爷
  • yongman on 记录一次KeyDB缓慢的定位过程
  • Alex on Istio中的透明代理问题
  • will on Istio中的透明代理问题
  • will on Istio中的透明代理问题
  • haolipeng on 基于本地gRPC的Go插件系统
  • 吴杰 on 基于C/C++的WebSocket库
©2005-2025 Gmem.cc | Powered by WordPress | 京ICP备18007345号-2