Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] Virtual Metlhods | questions

Hi Tom/Chris,
 I made it work. Please give it look and give me some feedback. I had
downloaded the  TLG JPA Grid Cache example and added following relationships
(using TLG to make sure every thing works in grid also)
 1) 1-1 with TLG_GC_PHONE
 2) 1-* with TLG_GC_PHONE
  (above relationship with TLG_GC_PHONE is purely imaginary to test
programmatic creation of mappings a map)
 3) Direct field mapping extChar0

My session customizer looks like

public class GridCacheSessionCustomizer implements SessionCustomizer {
	
	public static Map<String, Boolean> foreignReferenceMappingInformer = new
ConcurrentHashMap<String, Boolean>();
	

	public void customize(Session session) throws Exception {
		ClassDescriptor classDescriptor = session.getDescriptor(Employee.class);
		
		diirectFieldMapping(classDescriptor);
		
		oneToOneMapping(classDescriptor);
		
		oneToManyMapping(classDescriptor);
		
	}
	
	public static boolean isForeignReferenceMapping(Class<?> klass, String
property) {
		Boolean retValue =
foreignReferenceMappingInformer.get(String.format("%s#%s",
klass.getCanonicalName(),property));
		return retValue != null ? retValue : false;
	}
	
	/**
	 * Dynamically/programatically creating {@link OneToManyMapping} 
	 */
	private void oneToManyMapping(ClassDescriptor classDescriptor) {
		OneToManyMapping oneToManyMapping = new OneToManyMapping();
		oneToManyMapping.setDescriptor(classDescriptor);
		oneToManyMapping.setCascadeAll(true);
		oneToManyMapping.useBasicIndirection();
		
		VirtualAttributeAccessor virtualAttributeAccessor2 = new
VirtualAttributeAccessor();
		virtualAttributeAccessor2.setAttributeName("phoneNumbers");
		virtualAttributeAccessor2.setGetMethodName("getListValueHolder");
		virtualAttributeAccessor2.setSetMethodName("setListValueHolder");
		virtualAttributeAccessor2.setValueType(ValueHolderInterface.class);

	
virtualAttributeAccessor2.initializeAttributes(classDescriptor.getJavaClass());
		
		oneToManyMapping.setAttributeAccessor(virtualAttributeAccessor2);
		oneToManyMapping.setAttributeName("phoneNumbers");
		oneToManyMapping.setReferenceClass(PhoneNumber.class);
		Vector<String> sourceFieldNames = new Vector<String>();
		sourceFieldNames.add("PHONE_NUMBER_ID");
		oneToManyMapping.setSourceKeyFieldNames(sourceFieldNames);
		
		
		Vector<String> targetFieldNames = new Vector<String>();
		targetFieldNames.add("ID");
		oneToManyMapping.setTargetForeignKeyFieldNames(targetFieldNames);
		
		classDescriptor.getMappings().add(oneToManyMapping);
	}

	/**
	 * Dynamically/programatically create {@link OneToOneMapping} 
	 */
	private void oneToOneMapping(ClassDescriptor classDescriptor) {
		OneToOneMapping oneToOneMapping = new OneToOneMapping();
		oneToOneMapping.setDescriptor(classDescriptor);
		oneToOneMapping.setCascadeAll(true);
		oneToOneMapping.useBasicIndirection();
		
		VirtualAttributeAccessor virtualAttributeAccessor2 = new
VirtualAttributeAccessor();
		virtualAttributeAccessor2.setAttributeName("phoneNumber");
		virtualAttributeAccessor2.setGetMethodName("getValueHolder");
		virtualAttributeAccessor2.setSetMethodName("setValueHolder");
		virtualAttributeAccessor2.setValueType(ValueHolderInterface.class);
	
virtualAttributeAccessor2.initializeAttributes(classDescriptor.getJavaClass());
		
		foreignReferenceMappingInformer.put(String.format("%s#%s",
classDescriptor.getJavaClassName(),"phoneNumber"), Boolean.TRUE);
		
		oneToOneMapping.setAttributeAccessor(virtualAttributeAccessor2);
		oneToOneMapping.setAttributeName("phoneNumber");
		oneToOneMapping.setReferenceClass(PhoneNumber.class);
		oneToOneMapping.addForeignKeyFieldName("TLG_GC_EMPLOYEE.PHONE_NUMBER_ID",
"TLG_GC_PHONE.ID");
		
		
		classDescriptor.getMappings().add(oneToOneMapping);
	}

	/**
	 * Dynamically/programatically create {@link DirectToFieldMapping} 
	 */
	private void diirectFieldMapping(ClassDescriptor classDescriptor) {
		DirectToFieldMapping directToFieldMapping1 = new DirectToFieldMapping();
		directToFieldMapping1.setDescriptor(classDescriptor);
		
		VirtualAttributeAccessor virtualAttributeAccessor1 = new
VirtualAttributeAccessor();
		virtualAttributeAccessor1.setAttributeName("extChar0");
		virtualAttributeAccessor1.setGetMethodName("get");
		virtualAttributeAccessor1.setSetMethodName("set");
	
virtualAttributeAccessor1.initializeAttributes(classDescriptor.getJavaClass());
		
		directToFieldMapping1.setAttributeAccessor(virtualAttributeAccessor1);
		directToFieldMapping1.setAttributeClassification(String.class);
		directToFieldMapping1.setAttributeName("extChar0");
		
		DatabaseField databaseField1 = new DatabaseField("char_0");
		databaseField1.setNullable(false);
		databaseField1.setType(String.class);
		
		directToFieldMapping1.setField(databaseField1);
		
		classDescriptor.getMappings().add(directToFieldMapping1);
	}

}

My Employee class looks like

public class Employee implements Serializable {
	private static final long serialVersionUID = 299555566217698138L;

	@Id
	@GeneratedValue
	private int id;
	private String firstName;
	private String lastName;
//	@OneToMany(mappedBy="owner", cascade = ALL)
//	private List<PhoneNumber> phoneNumbers = new ArrayList<PhoneNumber>();
	@OneToOne(cascade = ALL, fetch=FetchType.LAZY)
	private Address address;
	@Version
	private long version;
	
	@Transient
	private Map<String, Object> extensions = new HashMap<String, Object>();
	
	
	public Object get(String key) {
		
		return ValueHolderInterface.class.isInstance(extensions.get(key)) ?
ValueHolderInterface.class.cast(extensions.get(key)).getValue() :
extensions.get(key);
	}
	
	public void set(String key,Object value) {
		if (GridCacheSessionCustomizer.isForeignReferenceMapping(getClass(), key))
{
			setValueHolder(key, getValueHolder(key));
		} else {
			extensions.put(key, value);
		}
	}
	
	
	public ValueHolderInterface getValueHolder(String key) {
		if (extensions.containsKey(key)) {
			Object value = extensions.get(key);
			if (ValueHolderInterface.class.isInstance(value)) {
				return ValueHolderInterface.class.cast(extensions.get(key));
			} 
		}
		extensions.put(key, new ValueHolder());
		return ValueHolderInterface.class.cast(extensions.get(key));
	}	
	
	public void setValueHolder(String key,ValueHolderInterface value) {
		extensions.put(key, value);
	}	
	
	public ValueHolderInterface getListValueHolder(String key) {
		if (extensions.containsKey(key)) {
			Object value = extensions.get(key);
			if (ValueHolderInterface.class.isInstance(value)) {
				return ValueHolderInterface.class.cast(extensions.get(key));
			} 
		}
		extensions.put(key, new ValueHolder(new ArrayList()));
		return ValueHolderInterface.class.cast(extensions.get(key));
	}	
	
	public void setListValueHolder(String key,ValueHolderInterface value) {
		extensions.put(key, value);
	}	
	

	public Employee() {
	}

	public int getId() {
		return id;
	}

	public void setId(int empId) {
		this.id = empId;
	}

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String fName) {
		this.firstName = fName;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lName) {
		this.lastName = lName;
	}

	public long getVersion() {
		return version;
	}

	@SuppressWarnings("unchecked")
	public List<PhoneNumber> getPhoneNumbers() {
		Object phoneNumbers = get("phoneNumbers");
		
		if (phoneNumbers == null) {
			return List.class.cast(getListValueHolder("phoneNumbers").getValue());
		}
		
		return List.class.cast(phoneNumbers);
		
	}

	public void setPhoneNumbers(List<PhoneNumber> phoneNumberList) {
		set("phoneNumbers", phoneNumberList);
	}

	public PhoneNumber addPhoneNumber(PhoneNumber phoneNumber) {
		getPhoneNumbers().add(phoneNumber);
		phoneNumber.setOwner(this);
		return phoneNumber;
	}

	public PhoneNumber addPhoneNumber(String type, String areaCode, String
number) {
		PhoneNumber phoneNumber = new PhoneNumber(type, areaCode, number);
		return addPhoneNumber(phoneNumber);
	}

	public PhoneNumber removePhoneNumber(PhoneNumber phoneNumber) {
		getPhoneNumbers().remove(phoneNumber);
		phoneNumber.setOwner(null);
		return phoneNumber;
	}

	public void setAddress(Address address) {
		this.address = address;
	}

	public Address getAddress() {
		return address;
	}

	public String toString() {
		return "Employee(" + getId() + ": " + getLastName() + ", " +
getFirstName() + "Extension map (will contain value holder for 1-1 & 1-*" +
extensions + ")";
	}

}


 
-- 
View this message in context: http://old.nabble.com/Virtual-Metlhods-%7C-questions-tp34172077p34184392.html
Sent from the EclipseLink - Users mailing list archive at Nabble.com.



Back to the top