在MySQL内部我创建了一些表格。我有一个包含所有项目的表用户。但现在我想估计谁有项目清单。来自tbl_items。
所以我的MySql我做了这样的事情:
但是现在如果我对列表项的映射有困难:
这是我的估计课程:
@Entity
@Table(name = "tbl_estimate")
@SecondaryTable(name = "tbl_order_items", pkJoinColumns = {@PrimaryKeyJoinColumn(name = "fk_id_estimate_order", referencedColumnName = "id_estimate")})
public class Estimate {
//Table estimate
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_estimate",table = "tbl_estimate")
private Integer id ;
@Column(table = "tbl_estimate")
private Integer fkIdUserEstimate;
@Column(table = "tbl_estimate")
private Integer fkIdClientEstimate;
//table order items
@Column(table = "tbl_order_items")
@OneToMany(fetch = FetchType.LAZY, mappedBy = "fk_id_estimate_order", cascade = CascadeType.ALL)
@Fetch(FetchMode.JOIN)
private List<Item> itemList = new ArrayList<>();
....
有人可以给我一些指示吗?
答案 0 :(得分:1)
首先,在使用JPA时,您应该在设计实体时忘记数据库的设计。映射外键id既不是必需的,也不是应该做的事情。 JPA是关于面向对象并隐藏数据库设计的细节。
如果您需要从OneToMany
到Estimate
的{{1}},最简单的方法是通过Item
:
JoinColumn
然后,您的@Entity
@Table(name = "tbl_estimate")
public class Estimate {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_estimate")
private Integer id ;
@JoinColumn(name = "estimate_id")
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<Item> items = new ArrayList<>();
...
}
- 表需要一个名为item
的{{1}}表的外来列。或者,使用连接表:
estimate
这将需要一个名为estimate_id
的表,其中列@Entity
@Table(name = "tbl_estimate")
public class Estimate {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_estimate")
private Integer id ;
@JoinTable(name = "estimate_item")
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<Item> items = new ArrayList<>();
...
}
和estimate_item
,每个表都有一个表的外键。可以使用estimate_id
注释中的items_id
嵌套@JoinColumn
来覆盖列的名称。
使用JPA时,最好从实体的设计开始,并基于此创建表。这种方法通常会提供最干净的设计。
此外,您使用inverseJoinColumn
- 属性错误,它的值不是数据库中的外键,而是实体关系另一侧的变量名。