@SuppressWarnings("unchecked")
public void translateToColumn(InfoForIndex<OWNER> info) {
OWNER entity = info.getEntity();
RowToPersist row = info.getRow();
Column col = new Column();
row.getColumns().add(col);
PROXY value = (PROXY) ReflectionUtil.fetchFieldValue(entity, field);
if(value instanceof ToOneProvider) {
value = (PROXY) ((ToOneProvider)value).get();
}
//Value is the Account.java or a Proxy of Account.java field and what we need to save in
//the database is the ID inside this Account.java object!!!!
byte[] byteVal = classMeta.convertEntityToId(value);
if(byteVal == null && value != null) {
//if value is not null but we get back a byteVal of null, it means the entity has not been
//initialized with a key yet, BUT this is required to be able to save this object
String owner = "'"+field.getDeclaringClass().getSimpleName()+"'";
String child = "'"+field.getType().getSimpleName()+"'";
String fieldName = "'"+field.getType().getSimpleName()+" "+field.getName()+"'";
throw new ChildWithNoPkException("The entity you are saving of type="+owner+" has a field="+fieldName
+" that does not yet have a primary key so you cannot save it. To correct this\n" +
"problem, you can either\n"
+"1. SAVE the "+child+" BEFORE you save the "+owner+" OR\n"
+"2. Call entityManager.fillInWithKey(Object entity), then SAVE your "+owner+"', then save your "+child+" NOTE that this" +
"\nmethod #2 is used for when you have a bi-directional relationship where each is a child of the other");
}
byte[] colBytes = StandardConverters.convertToBytes(columnName);
if(byteVal != null) {
byte[] name = new byte[colBytes.length + byteVal.length];
for(int i = 0; i < name.length; i++) {
if(i < colBytes.length)
name[i] = colBytes[i];
else
name[i] = byteVal[i-colBytes.length];
}
col.setName(name);
StorageTypeEnum storageType = getStorageType();
Object primaryKey = classMeta.fetchId(value);
addIndexInfo(info, primaryKey, byteVal, storageType);
removeIndexInfo(info, primaryKey, byteVal, storageType);
}
else {
col.setName(colBytes);
col.setValue(byteVal);
StorageTypeEnum storageType = getStorageType();
Object primaryKey = classMeta.fetchId(value);
addIndexInfo(info, primaryKey, byteVal, storageType);
removeIndexInfo(info, primaryKey, byteVal, storageType);
}