You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用JPA映射引用静态实例的实体属性?

解决方案

要实现预定义CardType实例与数据库存储的整数ID之间的映射,你可以通过以下方式完善代码:

核心思路

给每个CardType预定义实例分配唯一固定的ID,通过静态数组维护ID与实例的对应关系,同时直接利用实例的ID字段完成反向映射。

完整代码实现

@Entity
public class Card {
    @Id
    @GeneratedValue
    protected int id;
    private int type; // 存储CardType对应的ID

    public CardType getType() {
        return CardType.idToInstance(type);
    }

    public void setType(CardType cardType) {
        type = CardType.instanceToId(cardType);
    }

    public static class CardType {
        private final int id;
        private final String picture;
        private final String color;

        // 预定义实例,分配固定ID
        public static final CardType ClubCard = new CardType(0, "club", "black");
        public static final CardType DiamondCard = new CardType(1, "diamond", "red");
        public static final CardType SpadeCard = new CardType(2, "spade", "black");
        public static final CardType HeartCard = new CardType(3, "heart", "red");

        // 静态数组,按ID顺序存放所有实例,用于快速查找
        private static final CardType[] ALL_TYPES = {ClubCard, DiamondCard, SpadeCard, HeartCard};

        private CardType(int id, String picture, String color) {
            this.id = id;
            this.picture = picture;
            this.color = color;
        }

        public static CardType idToInstance(int typeId) {
            // 校验ID合法性,避免数组越界
            if (typeId >= 0 && typeId < ALL_TYPES.length) {
                return ALL_TYPES[typeId];
            }
            // 无效ID可返回null或抛出IllegalArgumentException
            throw new IllegalArgumentException("Invalid CardType ID: " + typeId);
        }

        public static int instanceToId(CardType cardType) {
            if (cardType == null) {
                throw new NullPointerException("CardType cannot be null");
            }
            return cardType.id;
        }

        // 可选:添加getter方法访问picture和color
        public String getPicture() {
            return picture;
        }

        public String getColor() {
            return color;
        }
    }
}

关键细节说明

  • 固定ID分配:给每个预定义CardType实例分配固定整数ID,确保数据库存储的ID与实例一一对应,不会因为实例创建顺序变化导致映射错误。
  • 静态数组查找:ALL_TYPES数组按ID顺序存储实例,idToInstance方法通过数组索引直接获取实例,效率极高。
  • 合法性校验:在转换方法中添加参数校验,避免无效ID或null值导致的运行时异常。
  • 不可变性:将CardType的字段设为final,确保预定义实例不可修改,保证数据一致性。

内容的提问来源于stack exchange,提问作者PaulerLeOne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 03:33:15