// create locking field
JDBCOptimisticLockingMetaData lockMetaData = metadata.getOptimisticLocking();
if (lockMetaData != null && lockMetaData.getLockingField() != null) {
JDBCOptimisticLockingMetaData.LockingStrategy strategy = lockMetaData.getLockingStrategy();
JDBCCMPFieldMetaData versionMD = lockMetaData.getLockingField();
versionField = getCMPFieldByName(versionMD.getFieldName());
boolean hidden = versionField == null;
switch (strategy) {
case VERSION_COLUMN_STRATEGY: {
if (hidden)
versionField = new JDBCLongVersionFieldBridge(manager, versionMD);
else
versionField = new JDBCLongVersionFieldBridge((JDBCCMP2xFieldBridge) versionField);
break;
}
case TIMESTAMP_COLUMN_STRATEGY: {
if (hidden)
versionField = new JDBCTimestampVersionFieldBridge(manager, versionMD);
else
versionField = new JDBCTimestampVersionFieldBridge((JDBCCMP2xFieldBridge) versionField);
break;
}
case KEYGENERATOR_COLUMN_STRATEGY: {
if (hidden)
versionField = new JDBCKeyGenVersionFieldBridge(manager, versionMD, lockMetaData.getKeyGeneratorFactory());
else
versionField = new JDBCKeyGenVersionFieldBridge((JDBCCMP2xFieldBridge) versionField, lockMetaData.getKeyGeneratorFactory());
break;
}
}
if (hidden)
addCMPField(versionField);
else
tableFields[versionField.getTableIndex()] = versionField;
}
// audit fields
JDBCAuditMetaData auditMetaData = metadata.getAudit();
if (auditMetaData != null) {
JDBCCMPFieldMetaData auditField = auditMetaData.getCreatedPrincipalField();
if (auditField != null) {
createdPrincipalField = getCMPFieldByName(auditField.getFieldName());
if (createdPrincipalField == null) {
createdPrincipalField = new JDBCCMP2xFieldBridge(manager, auditField);
addCMPField(createdPrincipalField);
}
} else {
createdPrincipalField = null;
}
auditField = auditMetaData.getCreatedTimeField();
if (auditField != null) {
createdTimeField = getCMPFieldByName(auditField.getFieldName());
if (createdTimeField == null) {
createdTimeField = new JDBCCMP2xFieldBridge(manager, auditField, JDBCTypeFactory.EQUALS, false);
addCMPField(createdTimeField);
} else {
// just to override state factory and check-dirty-after-get
createdTimeField = new JDBCCMP2xFieldBridge(
(JDBCCMP2xFieldBridge) createdTimeField, JDBCTypeFactory.EQUALS, false);
tableFields[createdTimeField.getTableIndex()] = createdTimeField;
}
} else {
createdTimeField = null;
}
auditField = auditMetaData.getUpdatedPrincipalField();
if (auditField != null) {
updatedPrincipalField = getCMPFieldByName(auditField.getFieldName());
if (updatedPrincipalField == null) {
updatedPrincipalField = new JDBCCMP2xUpdatedPrincipalFieldBridge(manager, auditField);
addCMPField(updatedPrincipalField);
} else {
updatedPrincipalField = new JDBCCMP2xUpdatedPrincipalFieldBridge(
(JDBCCMP2xFieldBridge) updatedPrincipalField);
tableFields[updatedPrincipalField.getTableIndex()] = updatedPrincipalField;
}
} else {
updatedPrincipalField = null;
}
auditField = auditMetaData.getUpdatedTimeField();
if (auditField != null) {
updatedTimeField = getCMPFieldByName(auditField.getFieldName());
if (updatedTimeField == null) {
updatedTimeField = new JDBCCMP2xUpdatedTimeFieldBridge(manager, auditField);
addCMPField(updatedTimeField);
} else {
updatedTimeField = new JDBCCMP2xUpdatedTimeFieldBridge((JDBCCMP2xFieldBridge) updatedTimeField);