Thank you for the additional insight.

Switching the DetachState is making things more clear.  I had it set
to a value of "all" before based on some example (not sure where from
though).

Here are answers to your questions - Hopefully by the time I finish
answering them all, I will have it working.

1) It is detached.
2) SInce changing the value of DetachState, I now get an exception.
3) The instance is being converted with JAXB marshaller immediately
after being loaded from the database.  So - no serialize/deserialize.

Here is the full routine that is loading the entity from the database
and marshalling it (slightly simplified):

public String sendXML(String projectID, User user) {
        StringWriter xml = new StringWriter();

        OpenJPAEntityManager em = getPM(entityManager);
        FetchPlan plan = em.getFetchPlan();

        plan.setMaxFetchDepth(0);
        plan.clearFetchGroups();
        plan.clearFields();

        plan.addField(Project.class, "projectID");
        plan.addField(Project.class, "projectNumber");
        plan.addField(Project.class, "projectVersion");
        plan.addField(Project.class, "projectRevision");
        plan.addField(Project.class, "projectItem");

        Project spec = em.find(Project.class, projectID);
        spec = em.detach(spec);

        try {
                JAXBContext context = JAXBContext.newInstance(spec.getClass());
                Marshaller m = context.createMarshaller();
                m.marshal(spec, xml);
        } catch (JAXBException je) {
                System.out.println("JAXB Exception: " + je.getMessage());
                je.printStackTrace();
        } catch (Exception e) {
                System.out.println("Some other exception doing JAXB conversion: 
" +
e.getMessage());
                e.printStackTrace();
        }

        System.out.println("XML: " + xml);
                
        return xml.toString();
}

Well, I've gone through your questions - And, I am much closer (maybe)
to where I need to be.  But, the 'm.marshall' call is trying to call
all of the getters of my entity.  So, it is kicking out
IllegalStateExceptions since the fields are unloaded.

If I set the DetachState to something else, would I be able to get it
to simply return blanks/nulls for the unloaded fields?

Thanks again for you help so far,

Jay
On Tue, Mar 31, 2009 at 12:20 AM, Pinaki Poddar <[email protected]> wrote:
>
> Hi,
>  You are correct in detaching the instance with the current fetch plan. In 
> theory, now the detached instance should only have the fields selected by the 
> fetch plan. If that is not happening then verify the following in order
>  1. Is the instance detached? OpenJPAEntityManager.isDetached(pc)
>  2. What happens if you access and fields that is not supposed to be loaded 
> in the detached instance?
> Configure openjpa.DetachState [1] with  AccessUnloaded to throw an exception 
> on any attempt to acess any unloaded field.
>  3. If the detached instane is serialized and deserialized, which fields in 
> the deserialized object are populated?
>
>  The above steps to ascertain that when JAXB is xmlizing the instance, 
> inadvertently no fields are getting loaded as a side-effect.
>
>  You have to tell me more about the process that convertes these instances 
> into XML -- such as when is this process is triggered? Which fields of the 
> managed instance are processed by this XMLization process? Is there any 
> possibility that a field will get loaded as a side-effect? Please note that 
> any pc.getXXX() on a managed instance pc will load the field XXX.
>
>
> [1] 
> http://openjpa.apache.org/builds/latest/docs/manual/manual.html#ref_guide_detach_behavior
>
> -----
> Pinaki Poddar                      http://ppoddar.blogspot.com/
>
> http://www.linkedin.com/in/pinakipoddar
> OpenJPA PMC Member/Committer
> JPA Expert Group Member
> --
> View this message in context: 
> http://n2.nabble.com/%27Masking%27-fields-in-an-Entity-tp2545263p2561243.html
> Sent from the OpenJPA Users mailing list archive at Nabble.com.
>
>

Reply via email to