gpt4 book ai didi

mysql - 使用 hibernate 将枚举存储在数据库中

转载 作者:行者123 更新时间:2023-11-29 06:53:32 25 4
gpt4 key购买 nike

我需要使用 Hibernate 存储一个对象,但是这个对象使用了一个枚举。我可以存储,但是当我再次尝试检索它时,失败并出现以下错误:“Studies is not mapped [FROM Studies]”。我在互联网上尝试了很多解决方案,但没有任何效果。我用的是MySQL数据库

这是枚举:

public enum StudyStatus {

Created("Created"), Started("Started"), Closed("Closed");

private final String value;

StudyStatus(String value){
this.value = value;
}



public static StudyStatus fromValue(int value){
for (StudyStatus status : values()) {
if (status.value.equals(value)) {
return status;
}
}
throw new IllegalArgumentException("Invalid status: " + value);
}

public String toValue(){
return value;
}

}

这是 EnumUserType 类

import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.Properties;

import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.type.AbstractStandardBasicType;
import org.hibernate.type.IntegerType;
import org.hibernate.type.StringType;
import org.hibernate.usertype.EnhancedUserType;
import org.hibernate.usertype.ParameterizedType;

public abstract class AbstractEnumUserType<E extends Enum<E>, V> implements
EnhancedUserType, ParameterizedType {

public static int DEAFAULT_SQL_TYPE = Types.INTEGER;

private PreparedStatementSetter psSetter;

private AbstractStandardBasicType<?> basicType;

protected abstract Class<E> getEnumClass();

protected abstract Class<V> getValueClass();

protected abstract E convertEnum(V rawValue);

protected abstract V convertSqlValue(E enumValue);

protected int getSqlType() {
int sqlType = Types.OTHER;
switch (getValueClass().getName()) {
case "java.lang.String":
sqlType = Types.VARCHAR;
break;
case "java.lang.Integer":
sqlType = Types.INTEGER;
break;
default:
break;
}

return sqlType;
}

// ////////////////////////////

@Override
public int[] sqlTypes() {
return new int[] { getSqlType() };
}

@Override
public Class<?> returnedClass() {
return getEnumClass();
}

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

@Override
public int hashCode(Object x) throws HibernateException {
return (x == null) ? 0 : x.hashCode();
}

@Override
public Object nullSafeGet(ResultSet rs, String[] names,
SessionImplementor session, Object owner)
throws HibernateException, SQLException {
Object rawValue = basicType.nullSafeGet(rs, names[0], session, owner);
Object enumValue = (rawValue == null) ? null
: convertEnum((V) rawValue);
return enumValue;
}

@Override
public void nullSafeSet(PreparedStatement st, Object value, int index,
SessionImplementor session) throws HibernateException, SQLException {
if (value == null) {
st.setNull(index, Types.VARCHAR);
} else {
psSetter.set(st, convertSqlValue((E) value), index);
}
}

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

@Override
public boolean isMutable() {
return false;
}

@Override
public Serializable disassemble(Object value) throws HibernateException {
return (Serializable) value;
}

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

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

@Override
public void setParameterValues(Properties parameters) {
// Initialize Method
initBasicType();
initPreparedStatementSetter();
}

@Override
public String objectToSQLString(Object value) {
return '\'' + ((Enum<?>) value).name() + '\'';
}

@Override
public String toXMLString(Object value) {
return ((Enum<?>) value).name();
}

@Override
public Object fromXMLString(String xmlValue) {
// TODO
throw new IllegalAccessError();
// return Enum.valueOf(, xmlValue);
}

protected void initBasicType() {

switch (getSqlType()) {
case Types.VARCHAR:
basicType = StringType.INSTANCE;
break;
case Types.INTEGER:
basicType = IntegerType.INSTANCE;
break;
default:
break;
}
}

protected void initPreparedStatementSetter() {
// TODO
switch (getSqlType()) {
case Types.VARCHAR:
psSetter = new StringPreparedStatementSetter();
break;
case Types.INTEGER:
psSetter = new IntPreparedStatementSetter();
default:
break;
}
}

private static interface PreparedStatementSetter {
void set(PreparedStatement st, Object value, int index)
throws SQLException;
}

private static class StringPreparedStatementSetter implements
PreparedStatementSetter {
@Override
public void set(PreparedStatement st, Object value, int index) {
try {
st.setString(index, (String) value);
} catch (SQLException e) {
}
}
}

private static class IntPreparedStatementSetter implements
PreparedStatementSetter {
@Override
public void set(PreparedStatement st, Object value, int index) {
try {
st.setInt(index, (Integer) value);
} catch (SQLException e) {
}
}
}

}

带有枚举的类

import java.util.ArrayList;

import ateam.capi.common.enums.StudyStatus;

public class Study {

private String id;
private String name;
private StudyStatus status;
private ArrayList<User> pollsters;
private Questionnaire actualQuestionnaire;

public Questionnaire getActualQuestionnaire() {
return actualQuestionnaire;
}

public void setActualQuestionnaire(Questionnaire actualQuestionnaire) {
this.actualQuestionnaire = actualQuestionnaire;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public StudyStatus getStatus() {
return status;
}

public void setStatus(StudyStatus status) {
this.status = status;
}

public ArrayList<User> getPollsters() {
return pollsters;
}

public void setPollsters(ArrayList<User> pollsters) {
this.pollsters = pollsters;
}

}

这是映射 Study 类的 XML

<hibernate-mapping package="ateam.capi.common.beans">
<class name="Study" table="Studies">
<id name="id" column="id"></id>
<property name="name"/>
<property name="status">
<type name="ateam.capi.capipersistence.utils.EnumUserType">
<param name="enumClassName">
ateam.capi.common.enums.StudyStatus
</param>
</type>
</property>
</class>
</hibernate-mapping>

学习DAO类

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import ateam.capi.capipersistence.utils.HibernateUtil;
import ateam.capi.common.beans.Questionnaire;
import ateam.capi.common.beans.Study;

public class DAO_Study {

private Session session;
private Transaction tx;

public void saveStudy(Study study) throws HibernateException{
try{
initOperations();
session.save(study);
tx.commit();
} catch (HibernateException ex){
handleException(ex);
throw ex;
} finally{
if (session!=null){
session.close();
}
}
}

public void deleteStudy(Study study) throws HibernateException{
try{
initOperations();
this.session.delete(study);
this.tx.commit();
} catch (HibernateException ex){
handleException(ex);
throw ex;
} finally{
if (session!=null){
session.close();
}
}
}

public List<Study> getStudiesList() throws HibernateException{
List<Study> studiesList = null;
try{
initOperations();
String hql = "FROM Studies";
Query query = session.createQuery(hql);
studiesList = query.list();
} catch (HibernateException ex){
handleException(ex);
throw ex;
} finally{
if (session!=null){
session.close();
}
}
return studiesList;
}

private void initOperations() throws HibernateException{
HibernateUtil.createSession();
this.session = HibernateUtil.getSessionFactory().openSession();
this.tx = this.session.beginTransaction();
}

private void handleException(HibernateException ex) throws HibernateException{
this.tx.rollback();
System.out.println(ex.getStackTrace());
throw ex;
}

}

我在 hibernate 4.1.8 中使用 Java7,我找到了其他解决方案但在 java7 中不起作用

有什么想法吗?谢谢!

最佳答案

您的查询不应该看起来像 from study 而不是 from studies 吗?研究是表而不是定义的实体。

关于mysql - 使用 hibernate 将枚举存储在数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14129896/

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