使用 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)