persistence@glassfish.java.net

Unintelligible error "String index out of range: 3"

From: Dmitry Mozheyko <mozheyko_d_at_mail.ru>
Date: Mon, 19 Jun 2006 11:54:54 +0400

Hello all.

I need unidirectional @ManyToMany relationship between two classes inheritable from one common parent:

#######################
# Person.java
#######################
package ejb;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public class Person implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    
    private String firstName;
    
    private String lastName;

    @Temporal(TemporalType.DATE)
    private Date birthDay;

    
    public Person() {
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Date getBirthDay() {
        return birthDay;
    }

    public void setBirthDay(Date birthDay) {
        this.birthDay = birthDay;
    }
    
}
#######################
# Customer.java
#######################
package ejb;

import javax.persistence.Entity;

@Entity
public class Customer extends Person {
    
    private String address;

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

}

#######################
# Employee.java
#######################
package ejb;

import java.util.Collection;
import javax.persistence.Entity;
import javax.persistence.ManyToMany;

@Entity
public class Employee extends Person {
    
    private String room;

    @ManyToMany
    private Collection<Customer> customers;
    
    public String getRoom() {
        return room;
    }

    public void setRoom(String room) {
        this.room = room;
    }

    public Collection<Customer> getCustomers() {
        return customers;
    }

    public void setCustomers(Collection<Customer> customers) {
        this.customers = customers;
    }
            
}

When i deploy this application i see this error:
String index out of range: 3
        at java.lang.String.substring(String.java:1765)
        at oracle.toplink.essentials.internal.ejb.cmp3.metadata.MetadataHelper.getAttributeNameFromMethodName(MetadataHelper.java:99)
        at oracle.toplink.essentials.internal.ejb.cmp3.metadata.MetadataDescriptor.getAccessorFor(MetadataDescriptor.java:317)
        at oracle.toplink.essentials.internal.ejb.cmp3.metadata.MetadataProcessor.processMapKey(MetadataProcessor.java:1295)
        at oracle.toplink.essentials.internal.ejb.cmp3.annotations.EJBAnnotationsProcessor.processMapKey(EJBAnnotationsProcessor.java:1327)
        at oracle.toplink.essentials.internal.ejb.cmp3.metadata.MetadataProcessor.processManyToMany(MetadataProcessor.java:1192)
        at oracle.toplink.essentials.internal.ejb.cmp3.annotations.EJBAnnotationsProcessor.processManyToMany(EJBAnnotationsProcessor.java:1303)
        at oracle.toplink.essentials.internal.ejb.cmp3.metadata.MetadataProcessor.processRelationshipAccessor(MetadataProcessor.java:1641)
        at oracle.toplink.essentials.internal.ejb.cmp3.annotations.EJBAnnotationsProcessor.processRelatedEntity(EJBAnnotationsProcessor.java:1786)
        at oracle.toplink.essentials.internal.ejb.cmp3.annotations.EJBAnnotationsProcessor.processORAnnotations(EJBAnnotationsProcessor.java:1543)
        at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:405)
        at oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider.createContainerEntityManagerFactory(EntityManagerFactoryProvider.java:156)
        at com.sun.jdo.spi.persistence.support.ejb.ejbc.PersistenceProcessor.loadPersistenceUnitBundle(PersistenceProcessor.java:457)
        at com.sun.jdo.spi.persistence.support.ejb.ejbc.PersistenceProcessor.generateDDLFiles(PersistenceProcessor.java:286)
        at com.sun.jdo.spi.persistence.support.ejb.ejbc.PersistenceProcessor.processAppBundle(PersistenceProcessor.java:176)
        at com.sun.jdo.spi.persistence.support.ejb.ejbc.PersistenceProcessor.processApplication(PersistenceProcessor.java:118)
        at com.sun.jdo.spi.persistence.support.ejb.ejbc.DeploymentEventListenerImpl.processApplication(DeploymentEventListenerImpl.java:193)
        at com.sun.jdo.spi.persistence.support.ejb.ejbc.DeploymentEventListenerImpl.processEvent(DeploymentEventListenerImpl.java:152)
        at com.sun.jdo.spi.persistence.support.ejb.ejbc.DeploymentEventListenerImpl.notifyDeploymentEvent(DeploymentEventListenerImpl.java:109)
        at com.sun.enterprise.deployment.backend.DeploymentEventManager.notifyDeploymentEvent(DeploymentEventManager.java:66)
        at com.sun.enterprise.deployment.backend.AppDeployer.postDeploy(AppDeployer.java:429)
        at com.sun.enterprise.deployment.backend.AppDeployer.deploy(AppDeployer.java:225)
        at com.sun.enterprise.deployment.backend.AppDeployer.doRequestFinish(AppDeployer.java:129)
        at com.sun.enterprise.deployment.phasing.J2EECPhase.runPhase(J2EECPhase.java:169)
        at com.sun.enterprise.deployment.phasing.DeploymentPhase.executePhase(DeploymentPhase.java:95)
        at com.sun.enterprise.deployment.phasing.PEDeploymentService.executePhases(PEDeploymentService.java:871)
        at com.sun.enterprise.deployment.phasing.PEDeploymentService.deploy(PEDeploymentService.java:266)
        at com.sun.enterprise.deployment.phasing.PEDeploymentService.deploy(PEDeploymentService.java:739)
        at com.sun.enterprise.management.deploy.DeployThread.deploy(DeployThread.java:174)
        at com.sun.enterprise.management.deploy.DeployThread.run(DeployThread.java:210)

Why?