2013-04-27 7 views
6

मैं आशा करती हूं मैं बस कुछ यहाँ मूर्खतापूर्ण कर रहा हूँ के साथ ...EclipseLink जेपीए "इस संदर्भ में अवैध तालिका" @OneToMany मानचित्र

मैं एक Map<String, Phone> के लिए जेपीए एनोटेशन स्थापित करने के लिए कोशिश कर रहा हूँ और हो रही है निम्नलिखित स्टैक ट्रेस।

EMP_PHONE 
================================= 
EMP_ID PHONES_ID PHONE_TYPE 
------ --------- ---------- 
42  1   NULL 


EMPLOYEE 
================================= 
ID 
-- 
42 


PHONE 
================================= 
ID NUM 
-- -------- 
1  867-5309 

NULLPHONE_TYPE मुझे कुछ अजीब बता रहा है पर जा रहा है, और जिस तरह से कि eclipselink EMPLOYEE.PHONE_TYPE की तलाश में है मुझे लगता है कि यह रिश्ते के बारे में सोच रहा है बनाता है:

Exception [EclipseLink-6069] (Eclipse Persistence Services - 2.4.1.v20121003-ad44345): org.eclipse.persistence.exceptions.QueryException 
Exception Description: The field [EMPLOYEE.PHONE_TYPE] in this expression has an invalid table in this context. 
Query: ReadAllQuery(name="phones" referenceClass=Phone) 
    at org.eclipse.persistence.exceptions.QueryException.invalidTableForFieldInExpression(QueryException.java:739) 
    at org.eclipse.persistence.internal.expressions.FieldExpression.validateNode(FieldExpression.java:281) 
    at org.eclipse.persistence.expressions.Expression.normalize(Expression.java:3259) 
    at org.eclipse.persistence.internal.expressions.DataExpression.normalize(DataExpression.java:369) 
    at org.eclipse.persistence.internal.expressions.FieldExpression.normalize(FieldExpression.java:208) 
    at org.eclipse.persistence.internal.expressions.SQLSelectStatement.normalize(SQLSelectStatement.java:1377) 
    at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.buildNormalSelectStatement(ExpressionQueryMechanism.java:546) 
    at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.prepareSelectAllRows(ExpressionQueryMechanism.java:1700) 
    at org.eclipse.persistence.queries.ReadAllQuery.prepareSelectAllRows(ReadAllQuery.java:721) 
    at org.eclipse.persistence.queries.ReadAllQuery.prepare(ReadAllQuery.java:657) 
    at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:614) 
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.checkPrepare(ObjectLevelReadQuery.java:883) 
    at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:575) 
    at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:820) 
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1109) 
    at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:393) 
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1197) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2875) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1602) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1584) 
    at org.eclipse.persistence.internal.indirection.QueryBasedValueHolder.instantiate(QueryBasedValueHolder.java:112) 
    at org.eclipse.persistence.internal.indirection.QueryBasedValueHolder.instantiate(QueryBasedValueHolder.java:99) 
    at org.eclipse.persistence.internal.indirection.DatabaseValueHolder.getValue(DatabaseValueHolder.java:88) 
    at org.eclipse.persistence.internal.indirection.UnitOfWorkValueHolder.instantiateImpl(UnitOfWorkValueHolder.java:161) 
    at org.eclipse.persistence.internal.indirection.UnitOfWorkValueHolder.instantiate(UnitOfWorkValueHolder.java:222) 
    at org.eclipse.persistence.internal.indirection.DatabaseValueHolder.getValue(DatabaseValueHolder.java:88) 
    at org.eclipse.persistence.indirection.IndirectMap.buildDelegate(IndirectMap.java:110) 
    at org.eclipse.persistence.indirection.IndirectMap.getDelegate(IndirectMap.java:330) 
    at org.eclipse.persistence.indirection.IndirectMap.size(IndirectMap.java:637) 
    at org.eclipse.persistence.internal.queries.MapContainerPolicy.sizeFor(MapContainerPolicy.java:830) 
    at org.eclipse.persistence.internal.indirection.TransparentIndirectionPolicy.instantiateObject(TransparentIndirectionPolicy.java:386) 
    at org.eclipse.persistence.mappings.ForeignReferenceMapping.buildCloneFromRow(ForeignReferenceMapping.java:285) 
    at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildAttributesIntoWorkingCopyClone(ObjectBuilder.java:1594) 
    at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildWorkingCopyCloneFromRow(ObjectBuilder.java:1741) 
    at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObjectInUnitOfWork(ObjectBuilder.java:668) 
    at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:605) 
    at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:564) 
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.buildObject(ObjectLevelReadQuery.java:777) 
    at org.eclipse.persistence.queries.ReadAllQuery.registerResultInUnitOfWork(ReadAllQuery.java:783) 
    at org.eclipse.persistence.queries.ReadAllQuery.executeObjectLevelReadQuery(ReadAllQuery.java:434) 
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeDatabaseQuery(ObjectLevelReadQuery.java:1150) 
    at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:852) 
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1109) 
    at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:393) 
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1197) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2875) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1602) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1584) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1549) 
    at org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:231) 
    at org.eclipse.persistence.internal.jpa.QueryImpl.getResultList(QueryImpl.java:411) 
    at aaa.Test.main(Test.java:20) 

बनाई गई तालिकाओं की तरह लग रहे PHONE ->EMPLOYEE से दूसरी तरफ के बजाए।

जेपीए इकाइयों को निम्नानुसार परिभाषित किया गया है। फोन मानचित्र दिशाहीन है, और फोन वस्तुओं कई कर्मचारियों द्वारा साझा किया जाना चाहिए (नहीं मेरे वास्तविक प्रकार है, लेकिन इस सरलीकृत उदाहरण समस्या को दर्शाता है)

@Entity 
public class Employee { 
    @Id private long id; 

    @OneToMany(cascade=CascadeType.ALL) 
    @JoinTable(name="EMP_PHONE", [email protected](name="EMP_ID")) 
    @MapKeyColumn(name="PHONE_TYPE") 
    private Map<String, Phone> phones = new HashMap<String, Phone>(); 

    public Employee() {} 
    public Employee(long id) { 
     this.id = id; 
    } 
    public long getId() { 
     return id; 
    } 
    public Map<String, Phone> getPhones() { 
     return phones; 
    } 
} 

@Entity 
public class Phone { 
    @Id 
    private long id; 
    private String num; 

    public String getNum() { 
     return num; 
    } 
    public Phone() {} 
    public Phone(String num) { 
     this.num = num; 
    } 
    public Phone(long id, String num) { 
     this.id = id; 
     this.num = num; 
    } 
    public long getId() { 
     return id; 
    } 
} 

निम्नलिखित परीक्षण कोड

EntityManagerFactory factory = Persistence.createEntityManagerFactory("test"); 
EntityManager em = factory.createEntityManager(); 
Employee employee = new Employee(42); 
// exception will occur with or without phones added to the map 
employee.getPhones().put("home", new Phone(1, "867-5309")); 
em.getTransaction().begin(); 
em.persist(employee); 
em.getTransaction().commit(); 

Query q = em.createQuery("select o from Employee o"); 
q.setHint("javax.persistence.cache.storeMode", "REFRESH"); 
q.getResultList(); // EXCEPTION THROWN HERE 

और दृढ़ता का उपयोग कर .xml:

<?xml version='1.0' encoding='UTF-8' ?> 
<persistence xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' 
    xsi:schemaLocation='http://java.sun.com/xml/ns/persistence 
      http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd' 
    version='2.0' xmlns='http://java.sun.com/xml/ns/persistence'> 
    <persistence-unit name='test' transaction-type='RESOURCE_LOCAL'> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <class>aaa.Phone</class> 
     <class>aaa.Employee</class> 
     <shared-cache-mode>NONE</shared-cache-mode> 
     <properties> 
      <property name='javax.persistence.jdbc.user' value='uuuuuuuu' /> 
      <property name='javax.persistence.jdbc.password' value='pppppppp' /> 
      <property name='javax.persistence.jdbc.driver' 
         value='oracle.jdbc.driver.OracleDriver' /> 
      <property name='javax.persistence.jdbc.url' 
         value='jdbc:oracle:thin:@localhost:1521:xe' /> 
      <property name='eclipselink.ddl-generation' 
         value='drop-and-create-tables' /> 
      <property name='eclipselink.ddl-generation.output-mode' value='database' /> 
     </properties> 
    </persistence-unit> 
</persistence> 

मैं डेटाबेस के रूप में ओरेकल एक्सई 11 जी का उपयोग कर विंडोज 7 पर चल रहा हूं। किसी भी अंतर्दृष्टि के लिए अग्रिम धन्यवाद!

उत्तर

10

यह EclipseLink बग 364922 की तरह दिखता है:

An entity with uni-directional OneToMany property and @MapKeyColumn annotation has the correct database tables created, with the mapping table containing a "key column, but persisting an entity only populates the id columns and not the key column. The persist operation does not throw an error, but subsequent queries soon fail with the following error: Exception Description: The field [ORGANIZATION.MAILINGADDRESSES_KEY] in this expression has an invalid table in this context.

के लिए क्या इसके लायक है, मैं अपने कोड हाइबरनेट/एच 2 का उपयोग कर परीक्षण किया है और यह ठीक काम करता है।

अद्यतन

मैं सिर्फ EclipseLink के साथ इस परीक्षण किया गया। यदि आप स्पष्ट रूप से MapKeyColumn के लिए तालिका सेट करते हैं, तो कुंजी सही ढंग से आबादी में आती है। i.e .:

@MapKeyColumn(name="PHONE_TYPE", table="EMP_PHONE")

+0

आपको बहुत बहुत धन्यवाद! मुझे लगता है कि विकल्पों का एक संयोजन मैंने कोशिश नहीं की है;) इच्छा है कि जब मैं खोज रहा था तो मैंने उस बग को देखा था। –

+0

मैंने इसे अपने असली ऐप में परीक्षण किया और यह पूरी तरह से काम करता है। धन्यवाद फिर से –

+0

खुशी है कि यह मदद की। मुझे जेपीए कार्यान्वयन के साथ छेड़छाड़ के मुद्दों का सामना करना पड़ा है और मुझे पता है कि वे आपको पागल कर सकते हैं;) – pwrex

संबंधित मुद्दे