使用Java / Spring

时间:2018-12-12 20:27:17

标签: java spring entities

我正在构建一个Spring Boot微服务,并且正在使用实体构建数据访问层。我想将1个实体Transactions映射到2个表。第一个表“交易”将具有transaction_id。第二个表还将使用相同的transaction_id作为其主键以及其他属性。最简单的方法是什么? 换句话说:

@Entity
class Transactions {

    @Id
    private Long transactionId;

    ??@OneToMany?? ( <--what do I put here?)
    private List<Groceryitem> items;
}

第一个表将存储长交易ID和GroceryItem的列表,如下所示:

Table: transactions
 ______________________
|                      |
| transactionId: Long  |
|                      |
| List<GroceryItem>    |
|______________________|

基本上使第一个表如下所示:

 transcation_id     |  
 --------------------
 1          
 2         

杂货项目是一个包含字段Float price的类,如下所示:

class GroceryItem {
    private String itemName;
    private Float price;

    Float getPrice() {
        return this.price;
    }

    String getName() {
        return this.itemName;
    }
}

我想将杂货项目列表存储在第二个表中,并使用相同的transactionId作为第二个表的主键。我还希望将来能够扩展“杂货店商品”以包含更多属性。

Table: items
 ______________________
|                      |
| transactionId: Float |
|                      |
| List<GroceryItem>    |
|                      |
| name:    String      |
|______________________|

第二张表如下所示:

 transaction_id     |    name    |    price    
 ------------------------------------------
 1                     carrot        15.00
 1                     apple         13.99
 2                     apple         3.00

如何正确注释交易和杂货项目类?

1 个答案:

答案 0 :(得分:0)

在您的情况下,一个好的解决方案是使用单向关系“一对多”,其中在Transaction类中具有GroceryItem的列表。您可以按以下方式进行操作:

@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,其中实体的一部分可以存储在一个表中(TRANSACTION),第二部分可以存储在第二个表中(TRANSACTION_DETAILS)