求教一个hibernate拿到原对象问题

owenor 发布于 2013/05/23 16:33
阅读 746
收藏 0

业务需求如下:

现在有一个有一个对象(A),我要判断这个对象是否存在于数据库,如果存在就要获得之前数据库的旧对象

而现在希望各位指导下,是否有hibernate自带方法可以获得旧对象,而不是根据主键值写语句去获得,因为我有很多不同的对象,对象的主键名不确定


以下是问题补充:

@owenor:我的想法是 在hibernate的saveorupdate方法里面不是会先去判断这个对象是否存在么 这都是通过去动xml配置获得主键然后拼成语句的 我现在想要的效果就是我传入一个对象然后hibernate自带的方法能去数据库查询得到一个主键值相同的原来就存在的对象 (2013/05/23 17:35)
加载中
0
skyline520
skyline520
这个不清楚,我觉得这个可以用业务逻辑层面来解决
0
王瑞平
王瑞平

不仅能用主键,hibernate可以生成按照任意列findby方法

0
o
owenor

引用来自“王瑞平”的答案

不仅能用主键,hibernate可以生成按照任意列findby方法

可能描述不清楚 我的想法是 在hibernate的saveorupdate方法里面不是会先去判断这个对象是否存在么 这都是通过去动xml配置获得主键然后拼成语句的 我现在想要的效果就是我传入一个对象然后hibernate自带的方法能去数据库查询得到一个主键值相同的原来就存在的对象
0
DanielTo
DanielTo

引用来自“owenor”的答案

引用来自“王瑞平”的答案

不仅能用主键,hibernate可以生成按照任意列findby方法

可能描述不清楚 我的想法是 在hibernate的saveorupdate方法里面不是会先去判断这个对象是否存在么 这都是通过去动xml配置获得主键然后拼成语句的 我现在想要的效果就是我传入一个对象然后hibernate自带的方法能去数据库查询得到一个主键值相同的原来就存在的对象
此言差矣,hibernate判断对象是否存在也是根据ID来做判断的,这种要求不能说是需求
0
o
owenor

引用来自“代号13”的答案

引用来自“owenor”的答案

引用来自“王瑞平”的答案

不仅能用主键,hibernate可以生成按照任意列findby方法

可能描述不清楚 我的想法是 在hibernate的saveorupdate方法里面不是会先去判断这个对象是否存在么 这都是通过去动xml配置获得主键然后拼成语句的 我现在想要的效果就是我传入一个对象然后hibernate自带的方法能去数据库查询得到一个主键值相同的原来就存在的对象
此言差矣,hibernate判断对象是否存在也是根据ID来做判断的,这种要求不能说是需求

我google了N久 解决了需求...

public String getPrimaryKey(Class clazz) {
		Configuration hibernateConf = new Configuration();//*.hbm.xml方式
		hibernateConf.addClass(clazz);
		PersistentClass pc = hibernateConf.getClassMapping(clazz.getName());
		String PKName = pc.getTable().getPrimaryKey().getColumn(0).getName();
		Field[] fields = clazz.getDeclaredFields();
		if (clazz.getGenericSuperclass() != null) {
			Field[] parentFields = ((Class<?>) clazz.getGenericSuperclass()).getDeclaredFields();
			if (fields.length == 0) {
				fields = parentFields;
			} else {
				System.arraycopy(parentFields, 0, fields, fields.length, parentFields.length);
			}
		}
		for (Field field : fields) {
			String attrName = field.getName();
			if (PKName.toLowerCase().equals(attrName.toLowerCase())) {
				System.out.println("当前属性名字是_____" + attrName);
				return attrName;
			}
		}
		return null;
	}
public Object getOldObject(Object object, String primaryKey) throws Exception {
		byte[] items = primaryKey.getBytes();
		items[0] = (byte) ((char) items[0] - 'a' + 'A');
		String getName = "get" + new String(items);
		String pkValue = (String) object.getClass().getMethod(getName).invoke(object);
		Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
		Criteria criteria = session.createCriteria(object.getClass());
		Criterion c1 = Expression.eq(primaryKey, pkValue);
		criteria.add(c1);
		List list = criteria.list();
		if (list != null && list.size() > 0) {
			return list.get(0);
		}
		return null;
	}

0
DanielTo
DanielTo

引用来自“owenor”的答案

引用来自“代号13”的答案

引用来自“owenor”的答案

引用来自“王瑞平”的答案

不仅能用主键,hibernate可以生成按照任意列findby方法

可能描述不清楚 我的想法是 在hibernate的saveorupdate方法里面不是会先去判断这个对象是否存在么 这都是通过去动xml配置获得主键然后拼成语句的 我现在想要的效果就是我传入一个对象然后hibernate自带的方法能去数据库查询得到一个主键值相同的原来就存在的对象
此言差矣,hibernate判断对象是否存在也是根据ID来做判断的,这种要求不能说是需求

我google了N久 解决了需求...

public String getPrimaryKey(Class clazz) {
		Configuration hibernateConf = new Configuration();//*.hbm.xml方式
		hibernateConf.addClass(clazz);
		PersistentClass pc = hibernateConf.getClassMapping(clazz.getName());
		String PKName = pc.getTable().getPrimaryKey().getColumn(0).getName();
		Field[] fields = clazz.getDeclaredFields();
		if (clazz.getGenericSuperclass() != null) {
			Field[] parentFields = ((Class<?>) clazz.getGenericSuperclass()).getDeclaredFields();
			if (fields.length == 0) {
				fields = parentFields;
			} else {
				System.arraycopy(parentFields, 0, fields, fields.length, parentFields.length);
			}
		}
		for (Field field : fields) {
			String attrName = field.getName();
			if (PKName.toLowerCase().equals(attrName.toLowerCase())) {
				System.out.println("当前属性名字是_____" + attrName);
				return attrName;
			}
		}
		return null;
	}
public Object getOldObject(Object object, String primaryKey) throws Exception {
		byte[] items = primaryKey.getBytes();
		items[0] = (byte) ((char) items[0] - 'a' + 'A');
		String getName = "get" + new String(items);
		String pkValue = (String) object.getClass().getMethod(getName).invoke(object);
		Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
		Criteria criteria = session.createCriteria(object.getClass());
		Criterion c1 = Expression.eq(primaryKey, pkValue);
		criteria.add(c1);
		List list = criteria.list();
		if (list != null && list.size() > 0) {
			return list.get(0);
		}
		return null;
	}

同样是用主键取得“你说的老对象”
0
DanielTo
DanielTo

引用来自“代号13”的答案

引用来自“owenor”的答案

引用来自“代号13”的答案

引用来自“owenor”的答案

引用来自“王瑞平”的答案

不仅能用主键,hibernate可以生成按照任意列findby方法

可能描述不清楚 我的想法是 在hibernate的saveorupdate方法里面不是会先去判断这个对象是否存在么 这都是通过去动xml配置获得主键然后拼成语句的 我现在想要的效果就是我传入一个对象然后hibernate自带的方法能去数据库查询得到一个主键值相同的原来就存在的对象
此言差矣,hibernate判断对象是否存在也是根据ID来做判断的,这种要求不能说是需求

我google了N久 解决了需求...

public String getPrimaryKey(Class clazz) {
		Configuration hibernateConf = new Configuration();//*.hbm.xml方式
		hibernateConf.addClass(clazz);
		PersistentClass pc = hibernateConf.getClassMapping(clazz.getName());
		String PKName = pc.getTable().getPrimaryKey().getColumn(0).getName();
		Field[] fields = clazz.getDeclaredFields();
		if (clazz.getGenericSuperclass() != null) {
			Field[] parentFields = ((Class<?>) clazz.getGenericSuperclass()).getDeclaredFields();
			if (fields.length == 0) {
				fields = parentFields;
			} else {
				System.arraycopy(parentFields, 0, fields, fields.length, parentFields.length);
			}
		}
		for (Field field : fields) {
			String attrName = field.getName();
			if (PKName.toLowerCase().equals(attrName.toLowerCase())) {
				System.out.println("当前属性名字是_____" + attrName);
				return attrName;
			}
		}
		return null;
	}
public Object getOldObject(Object object, String primaryKey) throws Exception {
		byte[] items = primaryKey.getBytes();
		items[0] = (byte) ((char) items[0] - 'a' + 'A');
		String getName = "get" + new String(items);
		String pkValue = (String) object.getClass().getMethod(getName).invoke(object);
		Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
		Criteria criteria = session.createCriteria(object.getClass());
		Criterion c1 = Expression.eq(primaryKey, pkValue);
		criteria.add(c1);
		List list = criteria.list();
		if (list != null && list.size() > 0) {
			return list.get(0);
		}
		return null;
	}

同样是用主键取得“你说的老对象”
只不过是自己反射生成主键,然后根据自己生成的主键再次获取对象,这个你应该试验一下自己生成的主键是否是Hibernate将要生成的主键,不然你获取的老对象都是“null”。
返回顶部
顶部