mysql 如何正确设计字段为列表或集合的表

f2uvfpb9  于 2023-01-01  发布在  Mysql
关注(0)|答案(1)|浏览(128)

我有一个可以拥有Wallet的用户。现在,当用户创建Wallet时,我希望为他提供一个在该Wallet上创建事务处理的选项。因此,在该表单上,我希望有下一个字段,提示用户插入:
一个月一次,一个月一次,一个月二次,一个月三次
到目前为止,我在Spring有这个:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "transaction_id")
private Integer id;

private double amount;

private String note;

@DateTimeFormat(pattern = "dd-MM-yyyy")
@Column(name = "date")
private Date date;

但我有字段category的问题。我想提示用户从下拉菜单中选择一个类别从列表中。但如何创建一个字段categories,将与类别名称填充?
我尝试了:

@Column(name = "categories")
private List categories;

但我得到了:

Could not determine type for: java.util.List, at table: transaction, for columns: [org.hibernate.mapping.Column(categories)]
igetnqfo

igetnqfo1#

SpringJPA允许你用几种不同的方法来处理这个问题,因为你没有指定一个类别是什么类型,我假设你希望它是一个String。

@元素集合

第一种,也是最简单的,通常推荐的方法是使用@ElementCollection,如果你的分类已经很好地固定了,你甚至可以使用enum

@ElementCollection
private List<String> categories=new ArrayList<>();

这样,JPA将在数据库中生成名为transaction_categories的第二个表。您不必为该表创建实体或其他任何东西,一切都在幕后处理。

JsonB

如果您正在使用postgres 10+(我认为),您可以将列转换为JSON对象。您将需要在Gradle中使用以下依赖项。

implementation 'com.vladmihalcea:hibernate-types-52:2.15.1'

您需要更改您的模型,如下所示:

@TypeDefs({
  @TypeDef(name = "json", typeClass = JsonType.class)
})
@Entity
public class Transaction {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "transaction_id")
  private Integer id;

  private double amount;
  private String note;

  @DateTimeFormat(pattern = "dd-MM-yyyy")
  @Column(name = "date")
  private Date date;

  @Type(type = "json")
  @Column(columnDefinition = "jsonb")
  private List<String> categories=new ArrayList<>();
}

只要这个列表不会变得庞大,它就是一个相当不错的解决方案。

相关问题