Hibernate annotation 自定义类型 userType

第一步:添加自定义类:

package com.a.entity;

import java.io.Serializable;

public class ConfigEntry implements Serializable {
	private static final long serialVersionUID = 6796578004411833529L;

	private String key;
	private String value;
	private Integer type;
	
	public String getKey() {
		return key;
	}
	public void setKey(String key) {
		this.key = key;
	}
	public String getValue() {
		return value;
	}
	public void setValue(String value) {
		this.value = value;
	}
	public Integer getType() {
		return type;
	}
	public void setType(Integer type) {
		this.type = type;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((key == null) ? 0 : key.hashCode());
		result = prime * result + ((type == null) ? 0 : type.hashCode());
		result = prime * result + ((value == null) ? 0 : value.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		ConfigEntry other = (ConfigEntry) obj;
		if (key == null) {
			if (other.key != null)
				return false;
		} else if (!key.equals(other.key))
			return false;
		if (type == null) {
			if (other.type != null)
				return false;
		} else if (!type.equals(other.type))
			return false;
		if (value == null) {
			if (other.value != null)
				return false;
		} else if (!value.equals(other.value))
			return false;
		return true;
	}

}

 

第二步:添加Hibernate UserType的实现类:

package com.aspire.usertype;

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

import net.sf.json.JSONArray;

import org.hibernate.HibernateException;
import org.hibernate.usertype.ParameterizedType;
import org.hibernate.usertype.UserType;

public class ListObjectType implements UserType, ParameterizedType {
	private static final int[] TYPES = new int[] { Types.CLOB };
	private static final String paramName = "clazzName";
	private Properties parameters;

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

	@Override
	public Object deepCopy(Object object) throws HibernateException {
		if (object == null)
			return null;
		if (!(object instanceof java.util.List))
			throw new UnsupportedOperationException("can't convert " + object.getClass());
		List sourceSet = (List) object;
		List targetSet = new ArrayList();
		if (sourceSet != null) {
			targetSet.addAll(sourceSet);
		}
		return targetSet;
	}

	@Override
	public Serializable disassemble(Object object) throws HibernateException {
		if (!(object instanceof java.util.List))
			throw new UnsupportedOperationException("can't convert " + object.getClass());
		return (Serializable) deepCopy(object);
	}

	@Override
	public boolean equals(Object one, Object other) throws HibernateException {
		if (one == other) {// 如果两个对象的指针是指向同一位置。
			return true;
		}
		if (!(one instanceof java.util.List))
			throw new UnsupportedOperationException("can't convert " + one.getClass());
		if (!(other instanceof java.util.List))
			throw new UnsupportedOperationException("can't convert " + other.getClass());
		if (one != null && other != null) {
			List set0 = (List) one;
			List set1 = (List) other;
			if (set0.size() != set1.size()) {// 如果列表的长度不相等
				return false;
			}
			Object[] s0 = set0.toArray();
			Object[] s1 = set1.toArray();
			if (s0.length != s1.length) {// 如果列表的长度不相等
				return false;
			}
			for (int i = 0; i < s0.length; i++) {
				Object id0 = s0[i];
				Object id1 = s1[i];
				if (!id0.equals(id1)) {// 如果在列表中相同位置上的对象不相等
					return false;
				}
			}
			return true;
		}
		return false;
	}

	@Override
	public int hashCode(Object obj) throws HibernateException {
		return obj.hashCode();
	}

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

	@Override
	public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
		String value = rs.getString(names[0]);
		List resultList = null;
		if (value != null) {
			try {
				String clazzName = parameters.getProperty(paramName);
				resultList = parse(value, Class.forName(clazzName));
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
		} else {
			resultList = new ArrayList();
		}
		return resultList;
	}

	/**
	 * 解析JSON字符成对象
	 * 
	 * @param value
	 * @return
	 */
	private List parse(String value, Class clazz) {
		List resultList = null;
		if (value != null) {
			JSONArray jsonArray = JSONArray.fromObject(value);
			resultList = jsonArray.toList(jsonArray, clazz);
		} else {
			resultList = new ArrayList();
		}
		return resultList;
	}

	/**
	 * 格式化对象成Json字符串
	 * 
	 * @param value
	 * @return
	 * @throws ClassNotFoundException
	 */
	private String format(List value) {
		String result = null;
		if (value != null) {
			JSONArray jsonArray = JSONArray.fromObject(value);
			result = jsonArray.toString();
		}
		return result;
	}

	@Override
	public void nullSafeSet(PreparedStatement stmt, Object value, int index) throws HibernateException, SQLException {
		if (value == null) {
			stmt.setNull(index, Types.CLOB);
			return;
		}
		if (!(value instanceof java.util.List))
			throw new UnsupportedOperationException("can't convert " + value.getClass());
		stmt.setString(index, format((java.util.List) value));
	}

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

	@Override
	public Class returnedClass() {
		return List.class;
	}

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

	@Override
	public void setParameterValues(Properties parameters) {
		this.parameters = parameters;

	}

}

 第三步:添加组合关键字字,

package com.a.entity;

import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Embeddable;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

import org.hibernate.annotations.OnDelete;
import org.hibernate.annotations.OnDeleteAction;

@Embeddable
public class ClientAppCfgId implements Serializable {

	private static final long serialVersionUID = 2291408665473574896L;

	@ManyToOne(targetEntity = ClientApp.class, cascade = { CascadeType.ALL }, optional = false)
	@JoinColumn(name = "app_id")
	@OnDelete(action = OnDeleteAction.CASCADE)
	private ClientApp app;
	
	@ManyToOne(targetEntity = Area.class, cascade = { CascadeType.ALL }, optional = false)
	@JoinColumn(name = "area_id")
	@OnDelete(action = OnDeleteAction.CASCADE)
	private Area area;

	public ClientApp getApp() {
		return app;
	}

	public void setApp(ClientApp app) {
		this.app = app;
	}

	public Area getArea() {
		return area;
	}

	public void setArea(Area area) {
		this.area = area;
	}

}

 

 

第四步:配置属性:

package com.a.entity;

import java.io.Serializable;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Version;

import org.hibernate.annotations.Parameter;
import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef;
import org.hibernate.annotations.TypeDefs;

/** 客户端配置 */
@TypeDefs({
		@TypeDef(name = "listObjectType", typeClass = com.a.usertype.ListObjectType.class, parameters = { @Parameter(name = "clazzName", value = "com.a.entity.ConfigEntry") }) })
@Entity
@Table(name = "t_client_app_cfg")
public class ClientAppCfg implements Serializable {

	private static final long serialVersionUID = -8929122435053630855L;

	@Id
	private ClientAppCfgId id;


	/***/
	@Type(type = "listObjectType")
	@Column(name = "config_params", columnDefinition = " clob default null")
	private List<ConfigEntry> configParams;

	public ClientAppCfgId getId() {
		return id;
	}

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


	public List<ConfigEntry> getConfigParams() {
		return configParams;
	}

	public void setConfigParams(List<ConfigEntry> configParams) {
		this.configParams = configParams;
	}

}

 第五:运行应用,将自动创建表(以下是表结构创建示例):

create table T_CLIENT_APP_CFG
(
  bg_type       NUMBER(10),
  bg_value      VARCHAR2(255 CHAR),
  help_url      VARCHAR2(500 CHAR),
  show_style    NUMBER(10),
  ver           NUMBER(10),
  app_id        NUMBER(19) not null,
  area_id       NUMBER(19) not null,
  config_params CLOB,
  primary key (APP_ID, AREA_ID)
)

 第六:插入数据:

INSERT INTO T_CLIENT_APP_CFG(APP_ID, AREA_ID, CONFIG_PARAMS) 
VALUES (10000, 1001, '[{"key":"a","type":0,"value":"a1"},{"key":"b","type":1,"value":"b1"},
{"key":"c","type":3,"value":"c1"},{"key":"d","type":4,"value":"d1"},
{"key":"e","type":5,"value":"e1"},{"key":"f","type":6,"value":"f1"},
{"key":"g","type":7,"value":"g1"},{"key":"h","type":8,"value":"h1"}]');

 第七:可以使用java代码试试。

 

第八:关于第四步的配置方法还有另外一种,可以参考以下示例:

package com.a.entity;

import java.io.Serializable;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Version;

import org.hibernate.annotations.Parameter;
import org.hibernate.annotations.Type;

/** 客户端配置 */
@Entity
@Table(name = "t_client_app_cfg")
public class ClientAppCfg implements Serializable {

	private static final long serialVersionUID = -8929122435053630855L;

	@Id
	private ClientAppCfgId id;


	/***/
	@Type(type= "com.a.usertype.ListObjectType", parameters = { @Parameter(name = "clazzName", value = "com.a.entity.ConfigEntry") })
	@Column(name = "config_params", columnDefinition = " clob default null")
	private List<ConfigEntry> configParams;

	public ClientAppCfgId getId() {
		return id;
	}

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

	public List<ConfigEntry> getConfigParams() {
		return configParams;
	}

	public void setConfigParams(List<ConfigEntry> configParams) {
		this.configParams = configParams;
	}

}

 

### 故障分析解决方案 #### 1. **故障描述** `vim.fault.GenericVmConfigFault` 是一种通用配置错误,在 VMware 的 vSphere 或 Workstation 环境中可能会触发此异常。通常情况下,这种错误表明虚拟机的某些配置存在问题或者不被支持。 此类错误可能发生在多个场景下,例如尝试迁移虚拟机、修改虚拟硬件设置或应用特定策略时[^1]。 --- #### 2. **常见原因** 以下是可能导致 `vim.fault.GenericVmConfigFault` 错误的原因: - 虚拟机配置文件损坏或丢失。 - 使用了不受目标主机支持的功能或设备(如高级网络适配器或存储控制器)。 - 版本兼容性问题:源主机目标主机之间的 VMware 工具版本不同步[^5]。 - 配置冲突:例如 CPU 数量超出许可范围或内存分配不合理。 - 存储路径不可访问或权限不足。 --- #### 3. **排查步骤** 为了有效解决问题,可以按照以下方式逐步排查并修复: ##### (a) 检查虚拟机配置文件 确认 `.vmx` 文件是否存在语法错误或其他损坏情况。可以通过重新导出虚拟机配置来验证其一致性。 ##### (b) 验证功能兼容性 如果正在执行跨主机操作(如 vMotion),需确保源主机目标主机具有相同的硬件辅助功能集支持级别。例如,检查是否启用了 EVC(Enhanced vMotion Compatibility Mode)模式。 ##### (c) 更新 VMware Tools 固件 保持所有组件处于最新状态有助于减少因过时软件引发的问题。对于 VMware Workstation 用户而言,升级到推荐版本(如 15 或 16)可能是必要的措施之一。 ##### (d) 审核日志记录 利用 `/var/log/vmkernel.log` 及其他相关日志文件定位具体失败位置及其上下文信息。这些数据能够提供更详细的线索用于进一步诊断[^3]。 --- #### 4. **解决方法** 针对上述提到的各种可能性,这里给出一些针对性建议: - 若发现 .vmx 文件有问题,则手动编辑修正;必要时重建受影响实例。 - 当存在资源争用现象时调整相应参数直至满足需求为止。 - 对于涉及安全连接的部分(比如 SSL/TLS 加密通信),生成新的证书链以替换旧有失效项[^4]。 下面展示了一个简单的 Python 脚本来帮助自动化部分任务处理过程: ```python import subprocess def generate_certificate(fqdn): command = [ "/usr/lib/vmware-vmca/bin/certool", "--server={}".format(fqdn), "--genCIScert", "--dataencipherment", "--privkey=/etc/vmware-vpx/ssl/data-encipherment.key", "--cert=/etc/vmware-vpx/ssl/data-encipherment.crt", "--Name=data-encipherment", "--FQDN={}".format(fqdn) ] try: result = subprocess.run(command, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) print("Certificate generated successfully.") print(result.stdout.decode()) except Exception as e: print("Failed to generate certificate:", str(e)) print(result.stderr.decode()) if __name__ == "__main__": fqdn_input = input("Enter FQDN of the server:") generate_certificate(fqdn_input.strip()) ``` --- ### 总结 通过对 `vim.fault.GenericVmConfigFault` 进行深入剖析可知,它往往是由多种因素共同作用造成的复杂状况。因此采取综合手段逐一排除潜在隐患显得尤为重要。同时也要注意定期维护整个 IT 基础设施从而预防类似事件再次发生。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值