1.在JPA的配置文件中properties中引入监听器
<property name="hibernate.ejb.event.post-insert" value="com.core.util.PostSaveEventListener" />
<property name="hibernate.ejb.event.post-update" value="com.core.util.PostUpdateEventListiner" />
<property name="hibernate.ejb.event.post-delete" value="com.core.util.PostDeleteEventListener" />
当JPA操作完成后,自动调用PostSaveEventListener,PostUpdateEventListiner,PostDeleteEventListener方法,支持联合主键取主键值,不支持外键更新,不支持属性为集合的变化记录,如需要外键更新可根据需要扩展,以下为save、update、delete三个操作类
package com.core.util;

import java.io.Serializable;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.hibernate.event.spi.PostInsertEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.unilogi.core.bean.LoginUserInfo;


/** *//**
*
* <p>
* PostSaveEventListener.
* </p>
*
* @author liu_dawei
*/

@SuppressWarnings(
{ "rawtypes", "unchecked", "serial" })

public class PostSaveEventListener extends org.hibernate.ejb.event.EJB3PostInsertEventListener
{

private static final Logger logger = LoggerFactory.getLogger(PostSaveEventListener.class);

private static PostSaveEventListener instance = null;


public static PostSaveEventListener getInstance()
{


if (null == instance)
{

instance = new PostSaveEventListener();
}
return instance;
}


private enum OperationType
{
CREATE, UPDATE, DELETE
}

@Override

public void onPostInsert(PostInsertEvent event)
{


try
{
Connection con = event.getSession().connection();

Map map = getContent(event);

postOperation(con, map, OperationType.CREATE.ordinal());

} catch (Exception e)
{
logger.error(e.getMessage());
}

}


/** *//**
* con: dataBase Connection map: result map
* <p>
* </p>
*
* @param con
* @param map
* @param operation
* @throws Exception
*/

public void postOperation(Connection con, Map map, int operation) throws Exception
{


try
{
String tableName = map.get("tableName") == null ? "" : map.get("tableName").toString();
StringBuffer PKNameBuffer = new StringBuffer();

if (null != map.get("pkName"))
{
List pkList = (List) map.get("pkName");

for (int i = 0; i < pkList.size(); i++)
{

if (false == PKNameBuffer.toString().equals(""))
{
PKNameBuffer.append(",");
}
Map tempMap = (Map) pkList.get(i);
Set tempsets = tempMap.keySet();
Iterator it = tempsets.iterator();

while (it.hasNext())
{
Object obj = it.next();
PKNameBuffer.append(obj.toString()).append("=").append(tempMap.get(obj));
}

}
}

String pkName = PKNameBuffer.toString();

con.setAutoCommit(false);

String sql = "insert into M_Data_Log(PK_Value, Description, Old_Value, New_Value, Operation_Type, Table_Name, User_Id,Update_Time, Data_Log_Id) "
+ "values(?,?,?,?,?,?,?,CURRENT_TIMESTAMP, M_Data_LOG_SEQ.nextval)";

PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, pkName);

if (operation == OperationType.CREATE.ordinal())
{
ps.setString(2, "save " + tableName);
}

if (operation == OperationType.UPDATE.ordinal())
{
ps.setString(2, "update " + tableName);
}

if (operation == OperationType.DELETE.ordinal())
{
ps.setString(2, "delete " + tableName);
}

ps.setString(3, map.get("previousproperty") == null ? "" : map.get("previousproperty").toString());
ps.setString(4, map.get("afterproperty") == null ? "" : map.get("afterproperty").toString());
ps.setLong(5, operation);
ps.setString(6, tableName);

LoginUserInfo loginUserInfo = SessionInfoManager.getContextInstance(
MessageManager.getInstance().getHttpServletRequest()).getCurrentUser();

ps.setInt(
7,
loginUserInfo == null ? Integer.parseInt("0") : Integer.parseInt(String.valueOf(loginUserInfo
.getUserId())));

ps.execute();
con.commit();
ps.close();

} catch (Exception e)
{


if (null != con)
{

try
{
con.rollback();

} catch (SQLException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
}

throw new Exception(e.getMessage());

} finally
{

try
{

if (null != con && con.isClosed() == false)
{
con.close();
}

} catch (SQLException e)
{
e.printStackTrace();
}
}

}

public Map getContent(PostInsertEvent event) throws IllegalArgumentException, IllegalAccessException,

InstantiationException, ClassNotFoundException
{

Map map = new HashMap();

// get table
Serializable[] serializables = event.getPersister().getPropertySpaces();
map.put("tableName", serializables[0]);

// get PK
String identifierPropertyName = event.getPersister().getIdentifierPropertyName();

Field[] tempFields = event.getEntity().getClass().getDeclaredFields();

for (int i = 0; i < tempFields.length; i++)
{

if (tempFields[i].getName().equals(identifierPropertyName))
{
List tempList = new ArrayList();
// if PK is Primitive

if (event.getPersister().getPropertyType(tempFields[i].getName()).isEntityType() == false)
{
Map tempMap = new HashMap();
tempFields[i].setAccessible(true);
tempMap.put(tempFields[i].getName(), tempFields[i].get(event.getEntity()));
tempList.add(tempMap);

} else
{
Class obj = event.getId().getClass();
Field[] objFields = obj.getDeclaredFields();

for (int j = 0; j < objFields.length; j++)
{

if (objFields[j].getName().equals("serialVersionUID"))
{
continue;
}
objFields[j].setAccessible(true);
Map tempMap = new HashMap();
tempMap.put(objFields[j].getName(), objFields[j].get(event.getId()));
tempList.add(tempMap);
}

}

map.put("pkName", tempList);

}
}

// get new value
StringBuffer buffer = new StringBuffer();


for (int i = 0; i < event.getState().length; i++)
{

if (false == buffer.toString().equals(""))
{
buffer.append(",");
}

// if collection or entity
if (event.getPersister().getPropertyType(event.getPersister().getPropertyNames()[i]).isCollectionType()

|| event.getPersister().getPropertyType(event.getPersister().getPropertyNames()[i]).isEntityType())
{
continue;
}

buffer.append(event.getPersister().getPropertyNames()[i]).append("=").append(event.getState()[i]);
}

map.put("afterproperty", buffer.toString());

return map;
}

}
package com.core.util;

import java.io.Serializable;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.hibernate.event.spi.PostUpdateEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/** *//**
*
* <p>
* PostUpdateEventListiner.
* </p>
*
* @author liu_dawei
*/

@SuppressWarnings(
{ "rawtypes", "unchecked", "serial" })

public class PostUpdateEventListiner extends org.hibernate.ejb.event.EJB3PostUpdateEventListener
{

private static final Logger logger = LoggerFactory.getLogger(PostUpdateEventListiner.class);


private enum OperationType
{
CREATE, UPDATE, DELETE
}

@Override

public void onPostUpdate(PostUpdateEvent event)
{


try
{
Connection con = event.getSession().connection();

Map map = getContent(event);

PostSaveEventListener.getInstance().postOperation(con, map, OperationType.UPDATE.ordinal());

} catch (Exception e)
{
logger.error(e.getMessage());
}

}

public Map getContent(PostUpdateEvent event) throws IllegalArgumentException, IllegalAccessException,

InstantiationException, ClassNotFoundException
{

Map map = new HashMap();

// get table
Serializable[] serializables = event.getPersister().getPropertySpaces();
map.put("tableName", serializables[0]);

// get PK
String identifierPropertyName = event.getPersister().getIdentifierPropertyName();

Field[] tempFields = event.getEntity().getClass().getDeclaredFields();

for (int i = 0; i < tempFields.length; i++)
{

if (tempFields[i].getName().equals(identifierPropertyName))
{
List tempList = new ArrayList();
// if PK is Primitive

if (event.getPersister().getPropertyType(tempFields[i].getName()).isEntityType() == false)
{
Map tempMap = new HashMap();
tempFields[i].setAccessible(true);
tempMap.put(tempFields[i].getName(), tempFields[i].get(event.getEntity()));
tempList.add(tempMap);

} else
{
Class obj = event.getId().getClass();
Field[] objFields = obj.getDeclaredFields();

for (int j = 0; j < objFields.length; j++)
{

if (objFields[j].getName().equals("serialVersionUID"))
{
continue;
}
objFields[j].setAccessible(true);
Map tempMap = new HashMap();
tempMap.put(objFields[j].getName(), objFields[j].get(event.getId()));
tempList.add(tempMap);
}

}

map.put("pkName", tempList);

}
}

// get change date
StringBuffer oldStateBuffer = new StringBuffer();
StringBuffer newStateBuffer = new StringBuffer();

for (int i = 0; i < event.getState().length; i++)
{
// after
Object oldValue = event.getOldState()[i];
// previous
Object newValue = event.getState()[i];

if ((null == oldValue && null != newValue)
|| (null != oldValue && null == newValue)
|| (null != oldValue && null != newValue && false == oldValue.toString()

.equals(newValue.toString())))
{

if ((false == oldStateBuffer.toString().equals("")))
{
oldStateBuffer.append(",");

}

if ((false == newStateBuffer.toString().equals("")))
{
newStateBuffer.append(",");

}

// if collection or entity
if (event.getPersister().getPropertyType(event.getPersister().getPropertyNames()[i]).isCollectionType()
|| event.getPersister().getPropertyType(event.getPersister().getPropertyNames()[i])

.isEntityType())
{
continue;
}

String propertyName = event.getPersister().getPropertyNames()[i];
oldStateBuffer.append(propertyName).append("=").append(oldValue);
newStateBuffer.append(propertyName).append("=").append(newValue);

}

}
map.put("previousproperty", oldStateBuffer.toString());
map.put("afterproperty", newStateBuffer.toString());

return map;

}

}
package com.core.util;

import java.io.Serializable;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.hibernate.ejb.event.EJB3PostDeleteEventListener;
import org.hibernate.event.spi.PostDeleteEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/** *//**
*
* <p>
* PostDeleteEventListener.
* </p>
*
* @author liu_dawei
*/
@SuppressWarnings("serial")

public class PostDeleteEventListener extends EJB3PostDeleteEventListener
{

private static final Logger logger = LoggerFactory.getLogger(PostDeleteEventListener.class);


private enum OperationType
{
CREATE, UPDATE, DELETE
}

@SuppressWarnings("rawtypes")
@Override

public void onPostDelete(PostDeleteEvent event)
{


try
{
Connection con = event.getSession().connection();

Map map = getContent(event);

PostSaveEventListener.getInstance().postOperation(con, map, OperationType.DELETE.ordinal());

} catch (Exception e)
{
logger.error(e.getMessage());
}

}


@SuppressWarnings(
{ "rawtypes", "unchecked" })
public Map getContent(PostDeleteEvent event) throws IllegalArgumentException, IllegalAccessException,

InstantiationException, ClassNotFoundException
{

Map map = new HashMap();

// get table
Serializable[] serializables = event.getPersister().getPropertySpaces();
map.put("tableName", serializables[0]);

// get PK
String identifierPropertyName = event.getPersister().getIdentifierPropertyName();

Field[] tempFields = event.getEntity().getClass().getDeclaredFields();

for (int i = 0; i < tempFields.length; i++)
{

if (tempFields[i].getName().equals(identifierPropertyName))
{
List tempList = new ArrayList();
// if PK is Primitive

if (event.getPersister().getPropertyType(tempFields[i].getName()).isEntityType() == false)
{
Map tempMap = new HashMap();
tempFields[i].setAccessible(true);
tempMap.put(tempFields[i].getName(), tempFields[i].get(event.getEntity()));
tempList.add(tempMap);

} else
{
Class obj = event.getId().getClass();
Field[] objFields = obj.getDeclaredFields();

for (int j = 0; j < objFields.length; j++)
{

if (objFields[j].getName().equals("serialVersionUID"))
{
continue;
}
objFields[j].setAccessible(true);
Map tempMap = new HashMap();
tempMap.put(objFields[j].getName(), objFields[j].get(event.getId()));
tempList.add(tempMap);
}

}

map.put("pkName", tempList);

}
}

// get old value
StringBuffer buffer = new StringBuffer();


for (int i = 0; i < event.getDeletedState().length; i++)
{

if (false == buffer.toString().equals(""))
{
buffer.append(",");
}

// if collection or entity
if (event.getPersister().getPropertyType(event.getPersister().getPropertyNames()[i]).isCollectionType()

|| event.getPersister().getPropertyType(event.getPersister().getPropertyNames()[i]).isEntityType())
{
continue;
}

buffer.append(event.getPersister().getPropertyNames()[i]).append("=").append(event.getDeletedState()[i]);
}

map.put("previousproperty", buffer.toString());

return map;
}

}

posted on 2012-11-01 11:28
孤飞燕 阅读(5186)
评论(0) 编辑 收藏 所属分类:
Hibernate||JPA