【hibernate】之标注枚举类型@Enumerated(转载)
实体Entity中通过@Enumerated标注枚举类型,例如将CustomerEO实体中增加一个CustomerType类型的枚举型属性,标注实体后的代码如下所示。
@Entity @Table(name = "customer") public class CustomerEO implements java.io.Serializable { …… private CustomerType type; @Enumerated(EnumType.STRING) public CustomerType getType() { return type; } public void setType(CustomerType type) { this.type = type; } public enum CustomerType { COMPETITOR, INVESTOR, PARTNER, VENDER } }
在实体中虽然标注成枚举类型,但当实体持久化后,表中所对应的值仍旧是基本的数据类型,以上代码创建表的SQL语句是:
CREATE TABLE customer ( id int(20) NOT NULL auto_increment, name varchar(255), type varchar(255), PRIMARY KEY (id) )
使用枚举类型后,在创建实体时便可以直接引用枚举类型,例如以下代码所示。
CustomerEO customer = new CustomerEO(); customer.setName("Janet2"); customer.setType(CustomerType.PARTNER); entityManager.persist(customer);
在使用@Enumerated注释时,需要注意以下几个问题:
因为枚举类型的有名称和值两个属性,所以在持久化时可以选择持久化名称或是持久化值。通过EnumType来定义,它有两个值如下所示。
public enum EnumType { ORDINAL, STRING }
ORDINAL表示持久化的为枚举类型的值,STRING表示持久化的为枚举类型的名称。默认为ORDINAL,持久化值。例如以上示例中标注的为STRING,这样持久化实体后,数据库中保存的是枚举类型的名称,如图所示。
若此时改成ORDINAL,代码如下:
@Enumerated(EnumType.ORDINAL)
public CustomerType getType() { return type; }
则同样持久化的实体后,数据库保存的结果如图所示。
l 如何选择STRING和ORDINAL:
如果使用STRING保存,虽然从数据库中查询数据时非常直观,能够清楚的看出该类型代表意义,但这样也会带来其他的问题。若此时枚举类型的定义改变,例如上例中的枚举类型名称改为:
public enum CustomerType {
CUST_COMPETITOR, INVESTOR, PARTNER, VENDER
}
则此时数据库中保存的“COMPETITOR”的值将不能转化为枚举类型CustomerType中的“CUST_COMPETITOR”的值。但若使用ORDINAL则不会带来这种问题。所以建议使用ORDINAL类型来持久化枚举类型。
l 枚举类型的定义位置,实体外部VS实体内部。
上例中CustomerType枚举类型定义在CustomerEO实体内部,这是因为只有CustomerEO这个实体会使用CustomerType类型,其他的实体不会使用该类型。该类型与这个实体关系紧密联系。
但若此时多个实体公用一个枚举类型时,则可以将枚举类型单独定义,定义在实体的外部。有这样一个枚举类型BusinessLine,它定义在实体外部,代码如下:
public enum BusinessLine {
REAL_ESTATE,FINANCE, NON_PROFIT
}
例如CustomerEO实体增加一个BusinessLine的枚举类型,代码如下所示。
@Entity @Table(name = "customer") public class CustomerEO implements java.io.Serializable { …… private BusinessLine businessLine; @Enumerated(EnumType.STRING) public BusinessLine getBusinessLine() { return businessLine; } public void setBusinessLine(BusinessLine businessLine) { this.businessLine = businessLine; } }
原文出处不明,所以无法加入链接...
【hibernate】之标注枚举类型@Enumerated(转载)的更多相关文章
- hibernate字段映射枚举类型
上一篇介绍了mybatis字段映射枚举类型,这一篇给大家介绍一下hibernate字段怎么去映射枚举类型的(这只是一种参考方式,映射方法还有很多种). 还是以上篇sku表为例,sku表里一个statu ...
- java枚举类型(转载)
public class TestEnum { /*最普通的枚举*/ public enum ColorSelect { red, green, yellow, blu ...
- 【hibernate postgresql】注解@TypeDef/@Enumerated/数据库字段gender为枚举类型,从前台接受到实体后进行保存报错:org.postgresql.util.PSQLException: ERROR: column "gender" is of type gender but expression is of type character varying
数据库字段gender为枚举类型,从前台接受到实体后进行保存报错:org.postgresql.util.PSQLException: ERROR: column "gender" ...
- [CLR via C#]15. 枚举类型和位标志
一.枚举类型 枚举类型(enumerated types)定义了一组"符号名称/值"配对. 例如,以下Color类型定义了一组符号,每个符号都标识一种颜色: internal en ...
- 重温CLR(十一) 枚举类型、位标志和数组
枚举类型 枚举类型(enumerated types)定义了一组"符号名称/值"配对.例如,以下Color类型定义了一组符号,每个符号都标识一种颜色: internal enum ...
- [转载] Java中枚举类型的使用 - enum
目录 1 枚举类的编译特性 2 向枚举类中添加方法 3 接口内部创建枚举 4 枚举类中使用枚举 5 扩展: 验证values()不是通过父类继承的 本文转载自博客 - Java枚举类型, 博主对原文内 ...
- hibernate的枚举注解@Enumerated
@Enumerated(value=EnumType.ORDINAL)采用枚举类型的序号值与数据库进行交互, 此时数据库的数据类型需要是数值类型,例如在实际操作中 CatTest ct = new C ...
- 转载 java枚举类型enum的使用 (原文地址:http://blog.csdn.net/wgw335363240/article/details/6359614)
java枚举类型enum的使用 最近跟同事讨论问题的时候,突然同事提到我们为什么java中定义的常量值不采用enmu枚举类型,而采用public final static 类型来定义呢?以前我们都是采 ...
- 【转载】Java枚举类型的使用
枚举类型概念 package com.lxq.enumm; public class EnumDemoOne { private enum InnerEnum { RED, GREEN, YELLOW ...
随机推荐
- 用过sessionid防钓鱼
http://www.cnblogs.com/BearsTaR/archive/2010/08/24/URL_SESSION_ID_LEEK.html DisableUrlSessionFilter
- leetcode 120 Triangle ----- java
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...
- window7资源管理器一直重启(百度知道找到可用)
今天我的机器也出现这种问题:我的解决方式是,在开机时选择系统修复选项中的进入命令行方式(尝试过用安全模式,文件被占用,现象一样),然后cd C:\Users\Administrator\AppData ...
- php文件遍历
<?php $dirname="shangchuan/uploads"; echo $dirname."共计大小为:".toSize(dirsize($d ...
- 10个你能参与并学习的Java开源项目
本文转载于:http://code.csdn.net/news/2822604 有很多备受关注的初创开源项目,下面列出十个项目是我觉得非常有趣的,涉及到的学习范围也很广.其中有些还在早期阶段,这对我们 ...
- (转)现代C++函数式编程
本文转自:http://geek.csdn.net/news/detail/96636 现代C++函数式编程 C++ 函数式编程 pipeline 开发经验 柯里化 阅读2127 作者简 ...
- 将caffe训练时loss的变化曲线用matlab绘制出来
1. 首先是提取 训练日志文件; 2. 然后是matlab代码: clear all; close all; clc; log_file = '/home/wangxiao/Downloads/43_ ...
- 安装postgreSQL出现configure:error:readline library not found解决方法
要安装 readline , readline-dev 开发包,要么使用 --without-readline 选项关闭 readline 功能. #yum install readline; #yu ...
- vb6异步ADO操作
Private withevents M_Conn as adodb.connection Private CmdFinished as boolean sub somesub AdoCmd.Exec ...
- sql server ,OVER(PARTITION BY)函数用法,开窗函数,over子句,over开窗函数
https://technet.microsoft.com/zh-cn/library/ms189461(v=sql.105).aspx https://social.msdn.microsoft.c ...