【项目课题】Hibernate的一对一关系联合主键ID类不同而引起的错误
来源:互联网 发布:js复合保温图集 编辑:程序博客网 时间:2024/06/06 21:35
hibernate 的保存,更新,删除都是通过触发一系列相关事件来处理的,对于一对一关系,在A表a,b为联合主键对应hibernate实体为A.id,B表中a,b同样联合主键对应hibernate实体为B.id且a,b的外键关联A表于是就有了一对一关系。
当取得对象B的时候触发DefaultLoadEventListener时间处理,这时传过来的ID,为A.id,但是在B的对象生成的时候确实需要B.id出现类型不匹配
解决方案:重写DefaultLoadEventListener修改事件传过来的A.id为B.id
代码
public class MyLoadEventListener extends DefaultLoadEventListener {/** * serialVersionUID */private static final long serialVersionUID = -3129774467686995363L;/** * HibernateのLoadイベントを呼び出す前に、 * 実体クラスのIDインスタンスをLoadイベントのIDインスタンスの代わりにする * * @param event Loadイベント * @param loadType Load種別 * @throws HibernateException */@Override@SuppressWarnings(Constant.UNCHECKED)public void onLoad(LoadEvent event, LoadEventListener.LoadType loadType) throws HibernateException {// イベントの呼び出す元final SessionImplementor source = event.getSession();// 実体クラスを取得するEntityPersister persister;if (event.getInstanceToLoad() != null) {persister = source.getEntityPersister(null, event.getInstanceToLoad());//the load() which takes an entity does not pass an entityNameevent.setEntityClassName(event.getInstanceToLoad().getClass().getName());} else {persister = source.getFactory().getEntityPersister(event.getEntityClassName());}if (persister == null) {throw new HibernateException("Unable to locate persister: " + event.getEntityClassName());}// 実体クラスのIDクラスfinal Class<Serializable> idClass = persister.getIdentifierType().getReturnedClass();// LoadイベントのIDインスタンスが実体クラスではない場合、// 実体クラスのIDインスタンスをLoadイベントのIDインスタンスの代わりにするif (idClass != null && !idClass.isInstance(event.getEntityId())) {Serializable id = null;try {// 実体クラスのIDクラスより、実体クラスのIDインスタンスを生成するid = (Serializable) idClass.newInstance();// LoadイベントのIDインスタンスより、、実体クラスに属性の値をコピーするBeanUtils.copyProperties(event.getEntityId(), id);} catch (Exception e) {// 異常が発生する場合、異常の情報しかを出力しないthrow new TypeMismatchException("Provided id of the wrong type for class " + persister.getEntityName() + ". Expected: " + idClass+ ", got " + event.getEntityId().getClass());}// 実体クラスのIDインスタンスをLoadイベントに設定するevent.setEntityId(id);}// HibernateのLoadイベントを呼び出すsuper.onLoad(event, loadType);}最后注册事件:
@Componentpublic class MyEventListenerRegistry {@Autowiredprivate SessionFactory sessionFactory;/** * イベントリスナーを登録する */@PostConstructpublic void registerListeners() {// イベントリスナーを管理するサービスを取得するEventListenerRegistry serviceRegistry = ((SessionFactoryImpl) sessionFactory) .getServiceRegistry().getService(EventListenerRegistry.class);// Loadイベントのリスナーを登録するserviceRegistry.prependListeners(EventType.LOAD, new EneresLoadEventListener());}}
0 0
- 【项目课题】Hibernate的一对一关系联合主键ID类不同而引起的错误
- hibernate主键相同的一对一关系
- Hibernate基于主键的一对一映射关系
- 《Hibernate学习笔记七》一对一联合主键的关联
- 《Hibernate学习笔记七》一对一联合主键的关联
- Hibernate关系映射(5)_一对一单向联合主键关联
- 项目中hibernate的联合主键用法
- 【Hibernate】--一对一关联、联合主键
- Hibernate的联合主键
- hibernate的联合主键
- hibernate的联合主键
- Hibernate之基于主键映射的一对一关联关系
- Hibernate基于主键的一对一关系----单向双向
- 主键引起的1062错误主键重复Hibernate
- Hibernate的一对一关系
- Hibernate的ID生成策略/联合主键解决方案
- Hibernate的ID生成策略/联合主键解决方案
- Hibernate中id的table生成策略之联合主键
- jQuery 获取当前节点的html包含当前节点的方法 --$(".test").prop("outerHTML");
- 【暮色天】世界杯完美谢幕 金银重回震荡?(7.14)
- app-framework学习--pannel介绍
- Java技术对存储模型的要求
- 详解Java反射机制实例
- 【项目课题】Hibernate的一对一关系联合主键ID类不同而引起的错误
- 三个有名的ACM Online Judge
- 网站前端代码与网站优化直接的联系(一)
- ubuntu win7 samba 安装 配置
- java获取当前路径的几种方法
- SQL的内连接与外连接
- 基于Bmob的Android即时通讯应用源码
- 反向互补子串
- ThinkPHP许愿池 笔记