具有一对多关系的休眠地图视图
hibernate map view with one to many relations
我正在使用休眠 @Subselect
注释将 sql 视图映射到实体 class。
基本上,它看起来有点像这样:
@Subselect(
"SELECT table1.*, table2.id as tid FROM "
+ "table1 INNER JOIN table2 on table2.field = table1.field"
)
@Entity
@Immutable
class Entity {
// fields
}
当加入工作时,我可能会得到类似下面的东西
========================================
| table1.id | table1.field | table2.id |
========================================
| 1 | 1 | 1 |
========================================
| 1 | 1 | 2 |
========================================
因此表 2 中的几条记录可以连接到表 1 中的一行。这很好,但是在 java 实体中我想将其映射为一对多关系(一个实体到多个 table2 实体),这是我写的,它适用于其他类型的关系:
@Subselect(
"SELECT table1.*, table2.id as tid FROM "
+ "table1 INNER JOIN table2 on table2.field = table1.field"
)
@Entity
@Immutable
class Entity {
@OneToMany
@JoinColumn(name = "tid", updatable = false, insertable = false)
private Set<Table2Entity> elements = new HashSet<>();
}
但是,实体中的集合总是空的,这是为什么呢?
上述方法适用于一对一和多对一关系。
反过来,不需要与 sql 连接来为视图实体带来一对多关系。我是这样解决的:
Subselect(
"SELECT * from table1"
)
@Entity
@Immutable
class Entity {
@OneToMany
@JoinColumn(name = "field", updatable = false, insertable = false)
private Set<Table2Entity> elements = new HashSet<>();
}
我只需要输入列名,需要连接的表就可以了。
我正在使用休眠 @Subselect
注释将 sql 视图映射到实体 class。
基本上,它看起来有点像这样:
@Subselect(
"SELECT table1.*, table2.id as tid FROM "
+ "table1 INNER JOIN table2 on table2.field = table1.field"
)
@Entity
@Immutable
class Entity {
// fields
}
当加入工作时,我可能会得到类似下面的东西
========================================
| table1.id | table1.field | table2.id |
========================================
| 1 | 1 | 1 |
========================================
| 1 | 1 | 2 |
========================================
因此表 2 中的几条记录可以连接到表 1 中的一行。这很好,但是在 java 实体中我想将其映射为一对多关系(一个实体到多个 table2 实体),这是我写的,它适用于其他类型的关系:
@Subselect(
"SELECT table1.*, table2.id as tid FROM "
+ "table1 INNER JOIN table2 on table2.field = table1.field"
)
@Entity
@Immutable
class Entity {
@OneToMany
@JoinColumn(name = "tid", updatable = false, insertable = false)
private Set<Table2Entity> elements = new HashSet<>();
}
但是,实体中的集合总是空的,这是为什么呢? 上述方法适用于一对一和多对一关系。
反过来,不需要与 sql 连接来为视图实体带来一对多关系。我是这样解决的:
Subselect(
"SELECT * from table1"
)
@Entity
@Immutable
class Entity {
@OneToMany
@JoinColumn(name = "field", updatable = false, insertable = false)
private Set<Table2Entity> elements = new HashSet<>();
}
我只需要输入列名,需要连接的表就可以了。