博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate 注解使用总结
阅读量:4209 次
发布时间:2019-05-26

本文共 6088 字,大约阅读时间需要 20 分钟。

1.@Entity注解

用于持久化POJO类

2.@Table注解

指定数据库的表,目录和schema@UniqueConstraints 可以定义表级约束
@Entity@Table(name = "student",schema = "hibernate")public class Student {    ...}

3.@Version注解

注解用于支持乐观锁版本控制。
@Version   @Column(name="OPTLOCK")   public Integer getVersion() { ... }

4.@Transient

属性将忽略不被持久化
@TransientStringgetLengthInMeter() { ... } //transient property

5. @Temporal

获取想要的时间类型TemporalType.DATE yyyy-MM-ddTemporalType.TIME  hh:mm:ssTemporalType.TIMESTAMP  yyyy-MM-dd hh:mm:ss 2016-12-07 11:47:58.697这个是会显示到毫秒的
@Basic@Column(name = "birth")@Temporal(TemporalType.DATE)public Date getBirth() {    return birth;}

6. @LOB

注解属性将被持久化为 Blog 或 Clob 类型1.java.sql.Clob, Character[], char[] 和 java.lang.String 将被持久化为 Clob 类型.   2.java.sql.Blob,Byte[], byte[] 和 serializable type 将被持久化为 Blob 类型。
@Lobpublic String getFullText() {   return fullText;  // clob type}@Lobpublic byte[] getFullCode() {  return fullCode;  // blog type}

7.@Column

注解将属性映射到列
name 列名unique是否在该列上设置唯一约束nullable 列可空insertable 该列是否作为生成insert语句的一个列updatable 该列是否作为生成 update语句的一个列columnDefinition   默认值table  定义对应的表(deault 是主表)length 列长度precision 精度scale 长度

8.@Embeddable 和 @AttributeOverride

覆盖该属性对应的嵌入式对象的列映射
@Embedded@AttributeOverrides({        @AttributeOverride(name = "phone", column = @Column(name = "phone")),        @AttributeOverride(name = "postCode", column = @Column(name = "postcode"))})public Address getAddress() {    return address;}

需要在对象上添加@Embeddable注解

@Embeddablepublic class Address {
private String postCode; private String phone; public Address() { } public Address(String postCode, String phone) { this.postCode = postCode; this.phone = phone; } public String getPostCode() { return postCode; } public void setPostCode(String postCode) { this.postCode = postCode; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } @Override public String toString() { return "Address{" + "postCode='" + postCode + '\'' + ", phone='" + phone + '\'' + '}'; }}

相当于

9.无注解属性默认值

属性为简单类型,则映射为@Basic

•属性对应的类型定义了@Embeddable 注解,则映射为@Embedded

•属性对应的类型实现了Serializable,则属性被映射为@Basic并在一个列中保存该对象的serialized版本。

•属性的类型为java.sql.Clob or java.sql.Blob, 则映射到 @Lob 对应的类型。

10.@Id

将实体Bean中某个属性定义为主键AUTO -  可以是 identity column, sequence 或者 table 类型,取决于不同底层的数据库TABLE - 使用table保存id值IDENTITY - identity columnSEQUENCE - sequence
@Id@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_STORE")public Integer getId(){ ... }@Id@GeneratedValue(strategy=GenerationType.IDENTITY)public Long getId() {
... }

@GenerateValue注解可以定义该标识符的生成策略。

11.映射实体Bean的关联关系

1 ) @OneToOne 一对一

建立实体Bean之间的一对一关系

1.共享同样的主键。 @PrimaryKeyJoinColumn注解定义了一对一的关联关系

@Entitypublic class Body {
@Id public Long getId() { return id; } @OneToOne(cascade = CascadeType.ALL) @PrimaryKeyJoinColumn public Heart getHeart() { return heart; } ...}
@Entitypublic class Heart {  @Id  public Long getId() { ...}}

2.其中一个实体通过外键关联到另一个实体的主键

通过@JoinColumn注解定义一对一的关联关系

@Entitypublic class Customer implements Serializable {
@OneToOne(cascade = CascadeType.ALL) @JoinColumn(name="passport_fk") public Passport getPassport() { ...}@Entitypublic class Passport implements Serializable {
@OneToOne(mappedBy = "passport") public Customer getOwner() { ...}

3.通过关联表来保存两个实体之间的关联关系

@Entitypublic class Customer implements Serializable {
@OneToOne(cascade = CascadeType.ALL) @JoinTable(name= "CustomerPassports", joinColumns= @JoinColumn(name="customer_fk"), inverseJoinColumns= @JoinColumn(name="passport_fk") ) public Passport getPassport() { ...}@Entity public class Passport implements Serializable {
@OneToOne(mappedBy = "passport") public Customer getOwner() { ...}

3) @ManyToOne 多对一

1.简单映射

@Entity()public class Flightimplements Serializable {
@ManyToOne( cascade = {CascadeType.PERSIST,CascadeType.MERGE} ) @JoinColumn(name="COMP_ID") public Company getCompany() { return company; } ...}

@JoinColumn 注解是可选的,关键字段默认值和一对一关联的情况相似。

列名为:主题的关联属性名 + 下划线 + 被关联端的主键列名

2.通过关联表的方式来映射 @JoinTable

@Entity()public class Flightimplements Serializable {
@ManyToOne( cascade = {CascadeType.PERSIST,CascadeType.MERGE} ) @JoinTable(name="Flight_Company", joinColumns =@JoinColumn(name="FLIGHT_ID"), inverseJoinColumns =@JoinColumn(name="COMP_ID") ) public Company getCompany() { return company; } ...}

4)@OneToMany 一对多注解

1.单向

只在一方配置@JoinColumn

@Entitypublic class Customer implements Serializable {
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER) @JoinColumn(name="CUST_ID") public Set
getTickets() { ... }@Entitypublic class Ticket implements Serializable {
... //no bidir}

2.双向

@Entitypublic class Troop {  @OneToMany(mappedBy="troop")  public Set
getSoldiers() { ...}@Entitypublic class Soldier { @ManyToOne @JoinColumn(name="troop_fk") public Troop getTroop() { ... }

报错java.lang.StackOverflowError

去掉任何一方的重写的toString方法即可

5)@ManyToMany 多对多

@Entitypublic class Employerimplements Serializable {
@ManyToMany( targetEntity=org.hibernate.test.metadata.manytomany.Employee.class, cascade={CascadeType.PERSIST,CascadeType.MERGE} ) @JoinTable( name="EMPLOYER_EMPLOYEE", joinColumns=@JoinColumn(name="EMPER_ID"), inverseJoinColumns=@JoinColumn(name="EMPEE_ID") ) public Collection getEmployees() { return employees; } ...}@Entitypublic class Employeeimplements Serializable {
@ManyToMany( cascade = {CascadeType.PERSIST,CascadeType.MERGE}, mappedBy = "employees", targetEntity = Employer.class ) public Collection getEmployers() { return employers; }}

用cascading 实现传播持久化(Transitivepersistence)

CascadeType.PERSIST:

如果一个实体是受管状态,或者当 persist() 函数被调用时,触发级联创建(create)操作

CascadeType.MERGE:

如果一个实体是受管状态,或者当merge() 函数被调用时,触发级联合并(merge)操作。

CascadeType.REMOVE:

当 delete() 函数被调用时,触发级联删除(remove)操作。

CascadeType.REFRESH:

当 refresh() 函数被调用时,出发级联更新(refresh)操作。

CascadeType.ALL:

以上全部

转载地址:http://uaqli.baihongyu.com/

你可能感兴趣的文章
手工挂载VMware共享目录
查看>>
【Kernel】pid 与 tgid
查看>>
【Error】make LKM时 找不到符号
查看>>
【转载】【C语言】浅析C语言之uint8_t / uint16_t / uint32_t /uint64_t
查看>>
【转载】yum update 自动忽略内核更新
查看>>
【maven】打包jar上传到服务器运行
查看>>
关闭centos wayland
查看>>
【Error】chsh: PAM: Authentication failure
查看>>
【Error】zsh历史记录丢失
查看>>
解析漏洞总结
查看>>
有趣的二进制 读书笔记
查看>>
【Windows C++】调用powershell上传指定目录下所有文件
查看>>
kotlin-android-extensions 插件无效问题
查看>>
经典排序算法--Java实现
查看>>
Java中JRadioButton单选按钮分组方法
查看>>
Java图形界面中单选按钮JRadioButton和按钮Button事件处理
查看>>
小练习 - 排序:冒泡、选择、快排
查看>>
SparkStreaming 如何保证消费Kafka的数据不丢失不重复
查看>>
Spark Shuffle及其调优
查看>>
数据仓库分层
查看>>