hibernate乐观锁_Hibernate Collection乐观锁定

hibernate乐观锁

介绍

Hibernate提供了一种乐观的锁定机制 ,即使长时间通话也可以防止更新丢失 。 结合实体存储,跨越多个用户请求(扩展的持久性上下文或分离的实体),Hibernate可以保证应用程序级的可重复读取

脏检查机制检测实体状态更改并增加实体版本。 尽管始终考虑基本属性更改,但是Hibernate集合在这方面更加微妙。

拥有与反向收藏

在关系数据库中,两个记录通过外键引用关联。 在这种关系中,引用记录是父记录,而引用行(外键侧)是子记录。 非空外键只能引用现有的父记录。

在面向对象的空间中,可以在两个方向上表示这种关联。 我们可以从孩子到父母有一对多的引用,而父母也可以有一对多的孩子集合。

因为双方都有可能控制数据库外键状态,所以我们必须确保只有一方是此关联的所有者。 仅拥有方状态更改会传播到数据库。 非持有端历来称为侧。

接下来,我将描述对该关联进行建模的最常用方法。

单向父项拥有子项关联映射

只有父方具有@OneToMany非逆子级集合。 子实体根本不引用父实体。

@Entity(name = "post")
public class Post {
	...
	@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
	private List<Comment> comments = new ArrayList<Comment>();
	...
}

单向父-子-子-子组件关联映射映射

子端不一定总是必须是实体,我们可以将其建模为组件类型 。 一个Embeddable对象(组件类型)可能同时包含基本类型和关联映射,但永远不能包含@Id。 可嵌入对象及其拥有的实体将被持久保存/删除。

父级具有@ElementCollection子级关联。 子实体只能通过不可查询的特定 Hibernate的@Parent批注来引用父实体。

@Entity(name = "post")
public class Post {
	...
	@ElementCollection
	@JoinTable(name = "post_comments", joinColumns = @JoinColumn(name = "post_id"))
	@OrderColumn(name = "comment_index")
	private List<Comment> comments = new ArrayList<Comment>();
	...

	public void addComment(Comment comment) {
		comment.setPost(this);
		comments.add(comment);
	}
}	

@Embeddable
public class Comment {
	...
	@Parent
	private Post post;
	...
}

双向父子侧子关联映射

父级是拥有方,因此它有一个@OneToMany非逆(不包含mappingBy指令)子级集合。 子实体通过@ManyToOne关联引用父实体,该关联既不可插入也不可更新:

@Entity(name = "post")
public class Post {
	...
	@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
	private List<Comment> comments = new ArrayList<Comment>();
	...

	public void addComment(Comment comment) {
		comment.setPost(this);
		comments.add(comment);
	}
}	

@Entity(name = "comment")
public class Comment {
	...
	@ManyToOne
	@JoinColumn(name = "post_id", insertable = false, updatable = false)
	pr
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值