zoukankan      html  css  js  c++  java
  • Hibernate入门之注解@Enumerated详解

    前言

    我们知道对于枚举既可以存储字符串也可以存储数字,那我们看看在JPA中到底应该如何正确的配置呢,文中若有错误之处,还望指正。

    @Enumerated注解

    在JPA中,必须用@Enumerated注解标记Enum类型,配置枚举类型有ORDINAL和STRING两种。接下来我们定义一个Order对象,如下:

    @Entity
    @Table(name = "orders")
    public class Order {
    
        @Id
        @GeneratedValue
        public long id;
    
        @Enumerated
        private Status status;
    }

    此时将映射为int类型,这也是默认映射的类型即ORDINAL,将枚举映射到表中的列类型为tinyint、enum应该是我们常见的方案,接下来我们来看看映射为varchar,如下:

    @Entity
    @Table(name = "orders")
    public class Order {
    
        @Id
        @GeneratedValue
        public long id;
    
        @Enumerated(EnumType.STRING)
        @Column(length = 8)
        private Status status;
    }

    如我们预期的结果,枚举类型为String表示来填充关联的数据库列值,对于我们开发人员而言,此列虽可读性强,但是明显将占用大量的空间,在这种情况下,状态列占用8个字节,如果我们要存储1亿条记录,仅status列将占用800 MB,所以我们都不会将枚举类型映射为varchar。我们可以将java中的枚举类型映射为数据库表中的列映射为enum,进行如下配置:

    @Enumerated(EnumType.STRING)
    @Column(columnDefinition = "enum('PENDING','SUCCESS', 'FAILED', 'CANCEL', 'CLOSED')")
    private Status status;

    将枚举类型映射为enum在网上存在较大的争议,这不是我们关注的点,其实我们也可以映射为tinyint、smallint类型,不过对于枚举类型利用tinyint已足够,我们进行如下配置:

    @Enumerated
    @Column(columnDefinition = "tinyint")
    private Status status;

    我个人认为将枚举映射为tinyint是最合适的,因为它效率更高,但可读性却不强,我们并不知道具体数字代表什么含义,对开发人员并不友好,其实在这种情况下,我们完全可以再创建一个表对状态的描述。

    总结 

    本节我们详细讲解了枚举注解,枚举注解类型有有两种ORDINAL和STRING两种,默认的ORDINAL映射为int,我们也可以通过columnDefinition映射为smallint、tinyint,而对于STRING我们可以映射为varchar、enum,在实际开发中,大部分情况应该都是将枚举映射为enum或者tinyint。好了,本节我们到此结束,下一节我们开始进入到关系映射讲解。

  • 相关阅读:
    1058 A+B in Hogwarts (20)
    1036. Boys vs Girls (25)
    1035 Password (20)
    1027 Colors in Mars (20)
    1009. Product of Polynomials (25)
    1006. Sign In and Sign Out
    1005 Spell It Right (20)
    1046 Shortest Distance (20)
    ViewPager页面滑动,滑动到最后一页,再往后滑动则执行一个事件
    IIS7.0上传文件限制的解决方法
  • 原文地址:https://www.cnblogs.com/CreateMyself/p/12431515.html
Copyright © 2011-2022 走看看