JPA 映射

一、实体父类

	@MappedSuperclass
	@ToString
	class BaseBean {
	
	    @Id
	    @GeneratedValue(strategy = GenerationType.IDENTITY)
	    Long id
	
	    /**
	     * 状态
	     */
	    @Enumerated(EnumType.STRING)
	    EnumRecordStatus recordStatus = EnumRecordStatus.A
	
	    LocalDateTime createTime = LocalDateTime.now()
	    LocalDateTime updateTime
	
	    boolean equals(o) {
	        if (this.is(o)) return true
	        if (getClass() != o.class) return false
	
	        BaseBean baseBean = (BaseBean) o
	
	        if (id != baseBean.id) return false
	
	        return true
	    }
	
	    int hashCode() {
	        return (int) (id ^ (id >>> 32))
	    }
	}
  • 在父类中统一定义一些共有属性,如创建时间,最后一次更新时间,记录状态等
  • 使用 @MappedSuperclass 声明该类为实体类的父类。
  • equals 方法和 hashcode 方法一定要同时重写, 否则会带来一些 “奇怪” 的错误。

二、实体

	@Entity
	@Table(name = "location")
	public class Location extends BaseBean 
	{
		...
	}
  • 通过 @Entity 标识一个实体类
  • 通过 @Table 标识实体映射的表信息,如表名等。

三、字段

1. 标识字段(ID)

	@Id
	@GeneratedValue(generator = "generator")
	@GenericGenerator(name = "generator", strategy = "increment")
	Long id
  • 通过@Id 注解标识 ID 字段。
  • 通过 @GeneratedValue 和 @GenericGenerator 定义 ID 生成策略。示例中采用的是自增长类型。

2. 枚举字段

	@Enumerated(EnumType.STRING)
	EnumRecordStatus recordStatus = EnumRecordStatus.A
  • @Enumerated(EnumType.STRING) 将枚举字段映射为字符类型,否则会记录数值型的枚举序号。

四、关联关系

1. 一对一

一个标签标定一个目标

	@OneToOne(targetEntity = Target.class)
	Target target

2. 一对多

在建筑物实体中有一个包含所包含楼层的列表:

    @OneToMany(targetEntity = Floor.class, mappedBy = "building", orphanRemoval = true)
    @OrderBy("orderIndex ASC")
    List<Floor> floors = new ArrayList<>()
  • 使用 @OneToMany 注解
  • 使用 @OrderBy 后,查询时会按指定字段排序

3. 多对一

楼层实体中定义,多个楼层对应一个建筑物实体

    @ManyToOne(targetEntity = Building.class)
    Building building
  • 使用 @ManyToOne 注解

4. 多对多

定位实体中,一个定位可能可能属于多种区域,一个区域也有多个定位记录

  	@ManyToMany(targetEntity = Area.class, fetch = FetchType.LAZY)
    @JoinTable(name = "location_2_area",
            joinColumns = @JoinColumn(name = "location_id"),
            inverseJoinColumns = @JoinColumn(name = "area_id"))
    Set<Area> areas = new HashSet<>()
  • 使用 @ManyToMany 注解
  • 可以使用 @JoinTable 来指定关联表信息, joinColumns 表明实体主键在关联表中的列名,inverseJoinColumns 表明关联实体主键在表中映射的列名。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值