ludc
2025-01-16 986aa62ed00bee39363bab41b4eeb8259d446efd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
package com.vci.server.base.persistence.history;
 
import java.lang.reflect.Field;
import java.util.Date;
 
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.collection.PersistentCollection;
import org.hibernate.event.PostDeleteEvent;
import org.hibernate.event.PostDeleteEventListener;
import org.hibernate.event.PostInsertEvent;
import org.hibernate.event.PostInsertEventListener;
import org.hibernate.event.PostUpdateEvent;
import org.hibernate.event.PostUpdateEventListener;
 
import com.vci.common.annotaion.CustomAnnotaion;
import com.vci.common.objects.AbstractEntity;
import com.vci.common.objects.Historizable;
import com.vci.common.utility.ObjectUtility;
 
public class HistoryListener implements PostInsertEventListener, 
        PostUpdateEventListener, PostDeleteEventListener {
 
    /**
     * 
     */
    private static final long serialVersionUID = -7290772791116036254L;
 
    public void onPostInsert(PostInsertEvent event) {
        if (event.getEntity() instanceof Historizable) {
            Historizable entity = (Historizable) event.getEntity();
            if(!entity.getUserEntity().getUserName().equals("developer")&&!entity.getUserEntity().getUserName().equals("admin")) {//开发者模块不记录日志
                HistoryEntry entry = new HistoryEntry();
                String id = ObjectUtility.getNewObjectID36();
                entry.setId(id);
                entry.setUser(entity.getUserEntity().getUserName());
                entry.setIp(entity.getUserEntity().getIp());
                entry.setModule(entity.getUserEntity().getModule());
                entry.setOperationType(OperationType.CREATE);
                entry.setTimestamp(new Date());
                entry.setHistorizableEntity(entity);
                recordHistory(event.getSession(), entry);
            }
        }
    }
 
    public void onPostUpdate(PostUpdateEvent event) {
        if (event.getEntity() instanceof Historizable) {
            Historizable entity = (Historizable) event.getEntity();
            if(!entity.getUserEntity().getUserName().equals("developer")&&!entity.getUserEntity().getUserName().equals("admin")) {//开发者模块不记录日志
                for (int i = 0; i < event.getState().length; i++) {
                    // 更新前的值
                    Object oldValue = event.getOldState()[i];
                    // 更新后的新值
                    Object newValue = event.getState()[i];
                    // 跳过集合属性
                    if (newValue instanceof PersistentCollection) {
                        continue;
                    }
                    if (oldValue != null && !oldValue.equals(newValue)) {
                        //对于大对象不在此进行日志记录
                        //Historizable entity = (Historizable) event.getEntity();
                        HistoryEntry entry = new HistoryEntry();
                        String id = ObjectUtility.getNewObjectID36();
                        entry.setId(id);
                        entry.setUser(entity.getUserEntity().getUserName());
                        entry.setIp(entity.getUserEntity().getIp());
                        entry.setModule(entity.getUserEntity().getModule());
                        // 取得属性名称
                        String pro = "";
                        Field f;
                        try {
                            f = entity.getClass().getDeclaredField(event.getPersister().getPropertyNames()[i]);
                            if(f != null){
                                CustomAnnotaion an = f.getAnnotation(CustomAnnotaion.class);
                                if(an != null){
                                    pro = an.CustomDescription();
                                }
                            }else{
                                pro = event.getPersister().getPropertyNames()[i];
                            }
                        } catch (SecurityException e) {
                            e.printStackTrace();
                            pro = event.getPersister().getPropertyNames()[i];
                        } catch (NoSuchFieldException e) {
                            e.printStackTrace();
                            pro = event.getPersister().getPropertyNames()[i];
                        }
                        entry.setProperty(pro);
                        entry.setOperationType(OperationType.UPDATE);
                        // 如果更改的属性是关联对象,则存储其id
                        if (oldValue instanceof AbstractEntity) {
                            entry.setPreviousValue(((AbstractEntity) oldValue).getId().toString());
                        } else {
                            entry.setPreviousValue(oldValue != null ? oldValue.toString() : null);
                        }
                        if (newValue instanceof AbstractEntity) {
                            entry.setNewValue(((AbstractEntity) newValue).getId().toString());
                        } else {
                            entry.setNewValue(newValue != null ? newValue.toString() : null);
                        }
                        entry.setTimestamp(new Date());
                        entry.setHistorizableEntity(entity);
                        recordHistory(event.getSession(), entry);
                    }
                }
            }
        }
    }
 
    public void onPostDelete(PostDeleteEvent event) {
        if (event.getEntity() instanceof Historizable) {
            Historizable entity = (Historizable) event.getEntity();
            if(!entity.getUserEntity().getUserName().equals("developer")&&!entity.getUserEntity().getUserName().equals("admin")) {//开发者模块不记录日志
                HistoryEntry entry = new HistoryEntry();
                String id = ObjectUtility.getNewObjectID36();
                entry.setId(id);
                entry.setUser(entity.getUserEntity().getUserName());
                entry.setIp(entity.getUserEntity().getIp());
                entry.setModule(entity.getUserEntity().getModule());
                entry.setOperationType(OperationType.DELETE);
                entry.setTimestamp(new Date());
                entry.setHistorizableEntity(entity);
                recordHistory(event.getSession(), entry);
            }
        }
    }
 
    private void recordHistory(Session session, HistoryEntry entry){
        Session tempSession = session.getSessionFactory().openSession();
        Transaction tx = tempSession.beginTransaction();
        try {
            tempSession.save(entry);
            tempSession.flush();
            tx.commit();
        } catch (Exception ex) {
            ex.printStackTrace();
            try {
                tx.rollback();
            } catch (Exception e) {
            }
        } finally { 
            try {
                tempSession.close();
            } catch (Exception e) {
            }
        }
    }
}