[ https://issues.apache.org/jira/browse/OPENJPA-2109?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Jody Grassel reassigned OPENJPA-2109: ------------------------------------- Assignee: Jody Grassel > Should @Factory methods fire on Entity Identity fields? > ------------------------------------------------------- > > Key: OPENJPA-2109 > URL: https://issues.apache.org/jira/browse/OPENJPA-2109 > Project: OpenJPA > Issue Type: Question > Components: kernel > Reporter: Jody Grassel > Assignee: Jody Grassel > Priority: Minor > > Question for the OpenJPA community. Recently I had made an observation with > the following code: > @Entity > public class JAGExternEntity { > @Id > @Externalizer("JAGExternEntity.toLowercaseString") > @Factory("JAGExternEntity.toUppercaseString") > private String id; > > @Externalizer("JAGExternEntity.toLowercaseString") > @Factory("JAGExternEntity.toUppercaseString") > private String extString; > ... > (Standard default constructor, getter and setter methods) > ... > public String toString() { > return "JAGExternEntity [id=" + id + ", extString=" + extString + > "]"; > } > > public static String toLowercaseString(String str) { > return str.toLowerCase(); > } > > public static String toUppercaseString(String str) { > return str.toUpperCase(); > } > } > > > Test Code (JUnit): > > public void test000() throws Exception { > JAGExternEntity jee = new JAGExternEntity(); > jee.setId("SomeIdentity"); > jee.setExtString("Some External String."); > > System.out.println("Pre Persist: " + jee); > > em.getTransaction().begin(); > em.persist(jee); > System.out.println("Post Persist: " + jee); > em.getTransaction().commit(); > System.out.println("Post Commit: " + jee); > > em.clear(); > > em.getTransaction().begin(); > Query q = em.createQuery("SELECT e FROM JAGExternEntity e"); > List<JAGExternEntity> resultList = q.getResultList(); > for (JAGExternEntity find : resultList) { > System.out.println("Query Result: " + find); > em.remove(find); > } > em.getTransaction().commit(); > } > > And the test output: > > 517 jag-test INFO [main] openjpa.Runtime - OpenJPA dynamically loaded a > validation provider. > 534 jag-test INFO [main] openjpa.Runtime - Starting OpenJPA > 2.1.2-SNAPSHOT > 576 jag-test INFO [main] openjpa.jdbc.JDBC - Using dictionary class > org.apache.openjpa.jdbc.sql.DerbyDictionary". > Pre Persist: JAGExternEntity [id=SomeIdentity, extString=Some External > String.] > Post Persist: JAGExternEntity [id=SomeIdentity, extString=Some External > String.] > Post Commit: JAGExternEntity [id=SomeIdentity, extString=Some External > String.] > Query Result: JAGExternEntity [id=someidentity, extString=SOME EXTERNAL > STRING.] > What the above demonstrates is that @Externalizers will fire for all > persistent fields, including identity fields, but @Factories will only fire > for non-identity persistent fields. This creates a one-way transformation > scenario, where externalized values cannot be reversed back for identity > fields. The OpenJPA documentation doesn't contain any text forbidding the > use of @Externalizer or @Factory on identity fields (except for embeddable > ids, which was the only noted exception.) > I would like to hear the opinions of the community on this behavior. Is it a > mistake that @Externalizer is allowed to fire on identity fields, but not > @Factory. Or is it a mistake to allow @Externalizer to be allowed to be used > by the identity field in the first place? Should any kind of transformation > on identity fields even be allowed, because of the data integrity/security > issues that could arise from it? -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa For more information on JIRA, see: http://www.atlassian.com/software/jira