MoyaChangedFieldsOptimisticLockingPolicy.java
1.8 KB
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
package fi.codecrew.moya.database.eclipselink;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.persistence.descriptors.ChangedFieldsLockingPolicy;
import org.eclipse.persistence.internal.helper.DatabaseField;
import org.eclipse.persistence.internal.helper.DatabaseTable;
import org.eclipse.persistence.internal.sessions.AbstractRecord;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Filters out JSON fields from Optimistic Locking policy that checks changed
* fields. JSON fields in PostgreSQL cannot be compared.
*
* @author jkj
*
*/
public class MoyaChangedFieldsOptimisticLockingPolicy extends ChangedFieldsLockingPolicy {
private static final long serialVersionUID = -1951931955910848024L;
private static final Logger log = LoggerFactory.getLogger(MoyaChangedFieldsOptimisticLockingPolicy.class);
/**
* Skip PGobject from ChangedFieldsLockingPolicy. PostgreSQL does not now
* how to compare JSON column, and this was the easiest way to work around
* it.
*/
@Override
protected List<DatabaseField> getFieldsToCompare(DatabaseTable table, AbstractRecord transRow, AbstractRecord modifyRow) {
// log.info("getFieldsToCompare({}, {}, {})", table, transRow,
// modifyRow);
List<DatabaseField> changedFields = super.getFieldsToCompare(table, transRow, modifyRow);
ArrayList<DatabaseField> fieldsToCompare = new ArrayList<DatabaseField>(changedFields.size());
// Filter out JSON fields because they cannot be compared
for (DatabaseField f : changedFields) {
// log.info("Field with typeName={}: {}", f.toString(),
// f.getTypeName());
if (!f.getTypeName().equals("org.postgresql.util.PGobject")) {
log.debug("Ignoring a PGobject field from changed fields optimistic locking policy: {}", f);
fieldsToCompare.add(f);
}
}
return fieldsToCompare;
}
}