Pie*_*rre 5 java hibernate jpa
我有一个与级联拥有的非定向 OneToMany 关系父级。
我想知道是否有一种方法可以优化 ORM 在插入、更新或删除时所做的请求。我知道如何配置批处理,但我看到了其他改进方式,ORM 正在执行的许多请求可以在单个查询中完成。
例如,考虑以下操作entityManager.persist(parent):
0 ms|statement|insert into parent (value) values (1)
0 ms|statement|insert into child (value) values (1)
0 ms|statement|insert into child (value) values (1)
3 ms|statement|insert into child (value) values (1)
0 ms|statement|update child set parent_id=1 where id=1
0 ms|statement|update child set parent_id=1 where id=2
0 ms|statement|update child set parent_id=1 where id=3
Run Code Online (Sandbox Code Playgroud)
可以替换为(至少对于 mysql 方言):
insert into parent (value) values (1);
insert into child (value) values (1),(1),(1);
update child set parent_id=1 where id in (1, 2, 3);
Run Code Online (Sandbox Code Playgroud)
级联删除也有同样的问题并且是可优化的。
hibernate 怎么可能检测不到这样的优化?我们是否有办法在 ORM 中的某处挂钩以在运行时过滤/改进/替换查询?
这是父/子类,但我认为它不会有帮助:
@Entity
public class Parent {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
public Long id;
public int value;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "parentId", referencedColumnName = "id")
public List<Child> children;
public Parent(Long id, int value, List<Child> children) {
this.id = id;
this.value = value;
this.children = children;
}
private Parent() {
}
}
@Entity
public class Child {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;
int value;
public Child(Long id, int value) {
this.id = id;
this.value = value;
}
private Child() {
}
}
Run Code Online (Sandbox Code Playgroud)
也许你可以尝试rewriteBatchStatements设置mysql?这是添加到 JDBC 连接 URL 的设置,它会重写大量插入语句并将它们内联到单个语句中,从而提高运行时间。我认为您还需要启用您已经为此执行的批处理。
请参阅:带有 rewriteBatchedStatements=true 的 MySQL 和 JDBC
还有此链接中的 mysql rewriteBatchedStatements 配置属性(您必须CTRL+ F): https: //dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-configuration-properties.html
| 归档时间: |
|
| 查看次数: |
162 次 |
| 最近记录: |