使用 2 个表和实体持久化集合,Java/Spring
Persist collection using 2 tables and Entities, Java/Spring
我正在构建一个 Spring 启动微服务,并且我正在使用实体构建数据访问层。我想将 1 个实体 Transactions
映射到 2 table。第一个 table "transactions" 将有一个 transaction_id。第二个 table 也将使用相同的 transaction_id 作为其主键,以及其他属性。最简单的方法是什么?
换句话说:
@Entity
class Transactions {
@Id
private Long transactionId;
??@OneToMany?? ( <--what do I put here?)
private List<Groceryitem> items;
}
第一个 table 将存储一个长交易 ID 和一个 GroceryItem
的列表,如下所示:
Table: transactions
______________________
| |
| transactionId: Long |
| |
| List<GroceryItem> |
|______________________|
基本上使第一个 table 看起来像这样:
transcation_id |
--------------------
1
2
Grocery Item 是一个 class,它包含一个字段 Float price
,如下所示:
class GroceryItem {
private String itemName;
private Float price;
Float getPrice() {
return this.price;
}
String getName() {
return this.itemName;
}
}
我想在第二个 table 中存储杂货项目列表,并使用相同的 transactionId
作为第二个 table 的主键。我也希望将来能够扩展 Grocery Item 以包含更多属性。
Table: items
______________________
| |
| transactionId: Float |
| |
| List<GroceryItem> |
| |
| name: String |
|______________________|
第二个 table 看起来像这样:
transaction_id | name | price
------------------------------------------
1 carrot 15.00
1 apple 13.99
2 apple 3.00
如何正确注释交易和杂货项目 classes?
在您的情况下,好的解决方案是使用单向关系一对多,其中您在交易中有 GroceryItem 列表 class。您可以按照以下方式进行操作:
@Entity
public Transaction {
...
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "transaction_id")
private List<GroceryItem> items = new ArrayList<>();
...
}
和
@Entity
public class GroceryItem {
...
}
如果您有一对一的关系,例如交易+交易明细。你可以想想@SecondaryTable,其中Entity的一部分可以存储在一个table(TRANSACTION)第二部分可以存储在第二个table(TRANSACTION_DETAILS)
我正在构建一个 Spring 启动微服务,并且我正在使用实体构建数据访问层。我想将 1 个实体 Transactions
映射到 2 table。第一个 table "transactions" 将有一个 transaction_id。第二个 table 也将使用相同的 transaction_id 作为其主键,以及其他属性。最简单的方法是什么?
换句话说:
@Entity
class Transactions {
@Id
private Long transactionId;
??@OneToMany?? ( <--what do I put here?)
private List<Groceryitem> items;
}
第一个 table 将存储一个长交易 ID 和一个 GroceryItem
的列表,如下所示:
Table: transactions
______________________
| |
| transactionId: Long |
| |
| List<GroceryItem> |
|______________________|
基本上使第一个 table 看起来像这样:
transcation_id |
--------------------
1
2
Grocery Item 是一个 class,它包含一个字段 Float price
,如下所示:
class GroceryItem {
private String itemName;
private Float price;
Float getPrice() {
return this.price;
}
String getName() {
return this.itemName;
}
}
我想在第二个 table 中存储杂货项目列表,并使用相同的 transactionId
作为第二个 table 的主键。我也希望将来能够扩展 Grocery Item 以包含更多属性。
Table: items
______________________
| |
| transactionId: Float |
| |
| List<GroceryItem> |
| |
| name: String |
|______________________|
第二个 table 看起来像这样:
transaction_id | name | price
------------------------------------------
1 carrot 15.00
1 apple 13.99
2 apple 3.00
如何正确注释交易和杂货项目 classes?
在您的情况下,好的解决方案是使用单向关系一对多,其中您在交易中有 GroceryItem 列表 class。您可以按照以下方式进行操作:
@Entity
public Transaction {
...
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "transaction_id")
private List<GroceryItem> items = new ArrayList<>();
...
}
和
@Entity
public class GroceryItem {
...
}
如果您有一对一的关系,例如交易+交易明细。你可以想想@SecondaryTable,其中Entity的一部分可以存储在一个table(TRANSACTION)第二部分可以存储在第二个table(TRANSACTION_DETAILS)