Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[eclipselink-users] DynamicClass Name containing a dot

Hi All

When we create a DynamicClass using DynamicClassLoader.createDynamicClass(className), then how is the class name expected to be interpreted if it contains a dot character.
Lets say if the className be "p.c".
Is "p" treated as the package and "c" as the class within the package?

The attached program throws the following exception:

Exception [EclipseLink-51000] (Eclipse Persistence Services - 2.3.0.v20110324-r9156): org.eclipse.persistence.exceptions.DynamicException
Exception Description: Invalid DynamicEntity[DynamicEntityType(type) - RelationalDescriptor(p1.type --> [DatabaseTable(addrinfo)])] property name: addrline2
    at org.eclipse.persistence.exceptions.DynamicException.invalidPropertyName(DynamicException.java:66)
    at org.eclipse.persistence.internal.dynamic.DynamicEntityImpl.get(DynamicEntityImpl.java:145)
    at jpatest.UniqueTypeName.main(UniqueTypeName.java:79)

Ideally I would expect p1.type and p2.type to be treated as separated classes. Is the above behavior expected or is it a bug in Eclipselink?

--
Thanks and Regards
Rohit Banga
Member Technical Staff
Oracle Server Technologies
import java.util.List;
import java.util.Vector;

import org.eclipse.persistence.dynamic.DynamicClassLoader;
import org.eclipse.persistence.dynamic.DynamicEntity;
import org.eclipse.persistence.dynamic.DynamicHelper;
import org.eclipse.persistence.dynamic.DynamicTypeBuilder;
import org.eclipse.persistence.internal.sessions.DatabaseSessionImpl;
import org.eclipse.persistence.jpa.dynamic.JPADynamicTypeBuilder;
import org.eclipse.persistence.queries.ReadAllQuery;
import org.eclipse.persistence.sessions.DatabaseLogin;
import org.eclipse.persistence.sessions.DatabaseRecord;
import org.eclipse.persistence.sessions.DatabaseSession;

public class UniqueTypeName
{
	public static void main(String[] args)
	{
		DatabaseLogin login = new DatabaseLogin();
		login.setUserName("*****");
		login.setPassword("*****");
		login.setDriverURLHeader("jdbc:oracle:thin:@");
		login.setDriverClassName("oracle.jdbc.OracleDriver");
		login.setDatabaseURL("***************");
		DatabaseSession session = new DatabaseSessionImpl(login);

		session.login();

		DynamicHelper helper = new DynamicHelper(session);
		DynamicClassLoader dcl = helper.getDynamicClassLoader();

		Class<?> type1 = dcl.createDynamicClass("p1.type");
		Class<?> type2 = dcl.createDynamicClass("p2.type");

		DynamicTypeBuilder type1Builder = new JPADynamicTypeBuilder(type1, null, "addrinfo");

		DynamicTypeBuilder type2Builder = new JPADynamicTypeBuilder(type2, null, "addrinfo");

		type1Builder.setPrimaryKeyFields("addrid");
		type1Builder.addDirectMapping("addrid", String.class, "addrid");
		type1Builder.addDirectMapping("addrline1", String.class, "addr1");

		type2Builder.setPrimaryKeyFields("addrid");
		type2Builder.addDirectMapping("addrid", String.class, "addrid");
		type2Builder.addDirectMapping("addrline1", String.class, "addr1");
		type2Builder.addDirectMapping("addrline2", String.class, "addr2");

		helper.addTypes(false, true, type2Builder.getType(), type1Builder.getType());

		ReadAllQuery query = new DynamicHelper(session).newReadAllQuery(
				type1Builder.getType().getDescriptor().getAlias());
		
		query.prepareCall(session, new DatabaseRecord());
		System.out.println("query: " + query.getSQLString());

		List<DynamicEntity> emps = (List<DynamicEntity>) session.executeQuery(query);

		for (DynamicEntity entity : emps)
		{
			System.out.println(entity.get("addrid"));
			System.out.println(entity.get("addrline1"));
			System.out.println();
		}

		ReadAllQuery query1 = new DynamicHelper(session).newReadAllQuery(
				type2Builder.getType().getDescriptor().getAlias());

		query1.prepareCall(session, new DatabaseRecord());
		System.out.println("query: " + query1.getSQLString());

		emps = (List<DynamicEntity>) session.executeQuery(query1);
		for (DynamicEntity entity : emps)
		{
			System.out.println(entity.get("addrid"));
			System.out.println(entity.get("addrline1"));
			System.out.println(entity.get("addrline2"));
			System.out.println();
		}

	}
}

Back to the top