Search code examples
openjpa

unidirectional @oneToMany without joinTable in openJpa 2


I am trying to create a unidirectional OneToMany mapping in openJpa 2.3.0, but i would also want to define the column name that will hold the foreighn key on the source table. As far as i know in JPA 2.0 this can be done as follows :

@Entity
public class Source {


    private List<Target> targets = new ArrayList<>();


    @OneToMany
    @JoinColumn(name="SOURCE_FK")
    public List<Target> getTargets() {
        return targets;
    }
}

But i get the following exception :

 <openjpa-2.3.0-r422266:1540826 fatal user error> org.apache.openjpa.persistence.ArgumentException: You have supplied columns for "Source.targets", but this mapping cannot have columns in this context.
at org.apache.openjpa.jdbc.meta.MappingInfo.assertNoSchemaComponents(MappingInfo.java:382)
at org.apache.openjpa.jdbc.meta.strats.RelationToManyTableFieldStrategy.map(RelationToManyTableFieldStrategy.java:97)
at org.apache.openjpa.jdbc.meta.strats.RelationCollectionTableFieldStrategy.map(RelationCollectionTableFieldStrategy.java:94)
at org.apache.openjpa.jdbc.meta.FieldMapping.setStrategy(FieldMapping.java:146)
at org.apache.openjpa.jdbc.meta.RuntimeStrategyInstaller.installStrategy(RuntimeStrategyInstaller.java:82)
at org.apache.openjpa.jdbc.meta.FieldMapping.resolveMapping(FieldMapping.java:496)
at org.apache.openjpa.jdbc.meta.FieldMapping.resolve(FieldMapping.java:461)
at org.apache.openjpa.jdbc.meta.ClassMapping.resolveMapping(ClassMapping.java:854)
at org.apache.openjpa.meta.ClassMetaData.resolve(ClassMetaData.java:1811)
at org.apache.openjpa.meta.MetaDataRepository.processBuffer(MetaDataRepository.java:829)
at org.apache.openjpa.meta.MetaDataRepository.resolveMapping(MetaDataRepository.java:784)
at org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:664)
at org.apache.openjpa.meta.MetaDataRepository.getMetaDataInternal(MetaDataRepository.java:418)
at org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:389)
at org.apache.openjpa.kernel.BrokerImpl.persistInternal(BrokerImpl.java:2666)
at org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2604)
at org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2587)
at org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2491)
at org.apache.openjpa.kernel.DelegatingBroker.persist(DelegatingBroker.java:1077)
at org.apache.openjpa.persistence.EntityManagerImpl.persist(EntityManagerImpl.java:716)
at 

It seems that openJpa 2.3.0 does not support the Joincolumn in unidirectional oneToMany. Is this true or am I missing something? If this is the case , is there a workaround without using join tables ?


Solution

  • Answering my own question : OpenJpa 2 DOES support @JoinColumn in OneToMany relationship.

    As I have found here there are various reasons that can lead to this exception.

    In my case the problem was the false schema url in the persistence.xml

    The problematic line was the followng one :

     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
    

    Which was telling the OpenJpa to comply with JPA 1.0 specifications (JPA 1.0 does not support this annotation in OneToMany relationship but JPA 2 does) I changed version to 2.0 and it worked fine.

    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0">