gpt4 book ai didi

java - JPA 实体中的枚举类型字段

转载 作者:行者123 更新时间:2023-12-03 18:48:54 25 4
gpt4 key购买 nike

是否可以将枚举用作自定义 JPA 实体中的一种字段(列)?这是一个例子:

@Getter @Setter
@Entity
@Table(name = "payments")
public class PaymentEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

@Column(name = "status")
private Integer statusId;

public PaymentStatuses getStatus() {
return PaymentStatuses.valueOf(statusId);
}

public PaymentEntity setStatus(PaymentStatuses status) {
statusId = status == null ? null : status.getId();
return this;
}
}

public enum PaymentStatuses {
CREATED(1),
COMPLETED(2),
CANCELED(3);


private Integer id;

private PaymentStatuses(Integer id) {
this.id = id;
}

public Integer getId() {
return id;
}

public static PaymentStatuses valueOf(Integer id) {
for (PaymentStatuses value : values())
if (value.getId().equals(id))
return value;
return null;
}
}

上面的代码工作正常,但是使用 statusIdgetStatus setStatus 的方法看起来有点难看。

我想使用 PaymentStatuses 作为我实体中的字段类型。像这样:

@Getter @Setter
@Entity
@Table(name = "payments")
public class PaymentEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

@Column(name = "status")
private PaymentStatuses status;
}

请告诉我,这可能吗?

最佳答案

使用 @Enumerated(EnumType.ORDINAL) 将不起作用,因为 ORDINAL 模式从 0 开始。
因此,枚举的前 3 个值将在 DB 中用 012 值表示。
而枚举中用于在数据库中表示它的 id 字段从 13 :

CREATED(1),
COMPLETED(2),
CANCELED(3);

此外,这种方式会将枚举中定义的元素的顺序与在数据库中表示它们的方式相关联。这不是一件好事,因为将来可能会添加/删除枚举值。

解决问题的更好方法是定义 javax.persistence.AttributeConverter并将其与 @Convert 一起使用.
因此,创建一个 AttributeConverter 实现来指示如何从 DB 转换为枚举以及如何将枚举转换为 DB。
然后在您的实体中声明一个 PaymentStatuses status 并通过指定 AttributeConverter 实现类用 @Convert 对其进行注释。

@Getter @Setter
@Entity
@Table(name = "payments")
public class PaymentEntity {
...
@Convert(converter = PaymentStatusesConverter.class)
private PaymentStatuses status;
...
}

public class PaymentStatusesConverter implements AttributeConverter<PaymentStatuses, Integer> {

@Override
public Integer convertToDatabaseColumn(PaymentStatuses status) {
return status.getId();
}

@Override
public PaymentStatuses convertToEntityAttribute(Integer status) {
return PaymentStatuses.valueOf(status);
}
}

关于java - JPA 实体中的枚举类型字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48867703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com