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