java - 如何拥有带有创建和更新日期的枚举查找表?

标签 java spring hibernate enums

我使用 Spring + Hibernate 来处理数据访问层操作。我想在数据库中创建一个具有以下属性的枚举查找表:

  1. 代码
  2. 描述
  3. 创建日期
  4. 更新日期

我有处理枚举查找表的代码。我不知道如何以其他枚举类也可以使用的方式添加创建日期和更新日期。

有什么建议吗?

最佳答案

Enum 现在对我来说比以往任何时候都更有意义。添加所有数据字段并创建一个构造函数。 保存所需的自定义枚举。这里提到了:

public enum Samples implements StringValuedEnum {
SampleA("V", "Sample A"), 
SampleB("M", "Sample B");

private String dbCode;
private String description;

Brand(String dbCode, String description){
    this.setDbCode(dbCode);
    this.setDescription(description);
}


@Override
public String getDbCode() {
    return this.dbCode;
}

public void setDbCode(String dbCode) {
    this.dbCode = dbCode;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}
}

/** * 设计用于检查 StringValuedEnums 的实用程序类。 */

public class StringValuedEnumReflect {

/**
 * Don't let anyone instantiate this class.
 * 
 * @throws UnsupportedOperationException
 *             Always.
 */
private StringValuedEnumReflect() {
    throw new UnsupportedOperationException(
            "This class must not be instanciated.");
}

/**
 * All Enum constants (instances) declared in the specified class.
 * 
 * @param enumClass
 *            Class to reflect
 * @return Array of all declared EnumConstants (instances).
 */
private static <T extends Enum<T>> T[] getValues(Class<T> enumClass) {
    return enumClass.getEnumConstants();
}

/**
 * All possible string values of the string valued enum.
 * 
 * @param enumClass
 *            Class to reflect.
 * @return Available string values.
 */
public static <T extends Enum<T> & StringValuedEnum> String[] getStringValues(
        Class<T> enumClass) {
    T[] values = getValues(enumClass);
    String[] result = new String[values.length];
    for (int i = 0; i < values.length; i++) {
        result[i] = values[i].getDbCode();
    }
    return result;
}

/**
 * Name of the enum instance which hold the especified string value. If
 * value has duplicate enum instances than returns the first occurency.
 * 
 * @param enumClass
 *            Class to inspect.
 * @param value
 *            String.
 * @return name of the enum instance.
 */
public static <T extends Enum<T> & StringValuedEnum> String getNameFromValue(
        Class<T> enumClass, String value) {
    T[] values = getValues(enumClass);
    for (T v : values) {
        if (v.getDbCode().equals(value)) {
            return v.name();
        }
    }
    return "";
}

}

扩展EnhancedUserType的类:

//请注意对 getNameFromValue 的调用 *************

 public class StringValuedEnumType<T extends Enum<T> & StringValuedEnum>
    implements EnhancedUserType, ParameterizedType {

/**
 * Enum class for this particular user type.
 */
private Class<T> enumClass;


/** Creates a new instance of ActiveStateEnumType */
public StringValuedEnumType() {
}

@SuppressWarnings("unchecked")
@Override
public void setParameterValues(Properties parameters) {
    String enumClassName = parameters.getProperty("enumClass");
    try {
        enumClass = (Class<T>) Class.forName(enumClassName)
                .asSubclass(Enum.class).asSubclass(StringValuedEnum.class); // Validates
                                                                            // the
                                                                            // class
                                                                            // but
                                                                            // does
                                                                            // not
                                                                            // eliminate
                                                                            // the
                                                                            // cast
    } catch (ClassNotFoundException cnfe) {
        throw new HibernateException("Enum class not found", cnfe);
    }

}

/**
 * The class returned by <tt>nullSafeGet()</tt>.
 * 
 * @return Class
 */
@SuppressWarnings("rawtypes")
public Class returnedClass() {
    return enumClass;
}

public int[] sqlTypes() {
    return new int[] { Types.VARCHAR };
}

public boolean isMutable() {
    return false;
}

/**
 * Retrieve an instance of the mapped class from a JDBC resultset.
 * Implementors should handle possibility of null values.
 * 
 * @param rs
 *            a JDBC result set
 * @param names
 *            the column names
 * @param owner
 *            the containing entity
 * @return Object
 * @throws HibernateException
 * @throws SQLException
 */
@Override
public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner)
        throws HibernateException, SQLException {
    String value = rs.getString(names[0]);
    if (value == null) { // no default value
        return null;
    }
    String name = getNameFromValue(enumClass, value);
    Object res = rs.wasNull() ? null : Enum.valueOf(enumClass, name);

    return res;
}

/**
 * Write an instance of the mapped class to a prepared statement.
 * Implementors should handle possibility of null values. A multi-column
 * type should be written to parameters starting from <tt>index</tt>.
 * 
 * @param st
 *            a JDBC prepared statement
 * @param value
 *            the object to write
 * @param index
 *            statement parameter index
 * @param session
 *            session   
 * @throws HibernateException
 * @throws SQLException
 */
@SuppressWarnings("unchecked")
@Override
public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session)
        throws HibernateException, SQLException {
    if (value == null) {
        st.setNull(index, Types.CHAR);
    } else {
        st.setString(index, ((T) value).getDbCode());
    }      
}

public Object assemble(Serializable cached, Object owner)
        throws HibernateException {
    return cached;
}

public Serializable disassemble(Object value) throws HibernateException {
    return (Enum<?>) value;
}

public Object deepCopy(Object value) throws HibernateException {
    return value;
}

public boolean equals(Object x, Object y) throws HibernateException {
    return x == y;
}

public int hashCode(Object x) throws HibernateException {
    return x.hashCode();
}

public Object replace(Object original, Object target, Object owner)
        throws HibernateException {
    return original;
}

@SuppressWarnings("unchecked")
public String objectToSQLString(Object value) {
    return '\'' + ((T) value).getDbCode() + '\'';
}

@SuppressWarnings("unchecked")
public String toXMLString(Object value) {
    return ((T) value).getDbCode();
}

public Object fromXMLString(String xmlValue) {
    String name = getNameFromValue(enumClass, xmlValue);
    return Enum.valueOf(enumClass, name);
}
}

示例实体类

 @Entity

@Table(名称 = "TCSM_BUS_ENTY") @DynamicUpdate 公共(public)类 SampleClient 扩展 java.io.Serialized {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "SID")
private Long id;

@Column(name = "SAMPLE_NM")
@Type(type = "com.sample.data.common.StringValuedEnumType", parameters = { @Parameter(name = "enumClass", value = "com.sample.data.model.types.BusinessType") })
private Sample sample;
 }

关于java - 如何拥有带有创建和更新日期的枚举查找表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21299907/

相关文章:

跟踪文件复制的 Java 程序

java - 使用客户端身份验证 : handshake_failure 的 Web 服务访问

java - 如何使用动态 JLabels 和 JButton 创建新的 JFrame 而不会遇到 NullPointerException?

hibernate - 在JPA 2中使用投影

java - Hibernate 批量大小混淆

java - Jmeter 监听器显示 "javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?"

Spring Boot 和外部配置

spring - 将 Camel 2.1 与 Grails 1.2.1 一起使用 - 类加载问题

java - 我们可以安全地将 `tomcat.addTldSkipPatterns("*.jar")` 用于使用嵌入式 tomcat 的纯后端 spring 引导服务吗

hibernate - CASE WHEN THEN ELSE END 中的 bool 文字