user1712638
user1712638

Reputation: 327

JPA exception while mapping to entities

Hi I'm writing one of my very first JPA projects and I'm kinda newbie in this field, so please try to simplify stuff as much as you can :) Here's one of the entities

package model;

import java.io.Serializable;
import java.sql.Date;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;

@Entity

public class Speaker implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    @Id @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;
    private String name;
    private Date dob;
    private String skills;
    @OneToMany(mappedBy="event",cascade={CascadeType.ALL})
    private Set <Session> speakerSessions;

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }
    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }
    /**
     * @return the dob
     */
    public Date getDob() {
        return dob;
    }
    /**
     * @param dob the dob to set
     */
    public void setDob(Date dob) {
        this.dob = dob;
    }
    /**
     * @return the skills
     */
    /**
     * @return the skills
     */
    public String getSkills() {
        return skills;
    }
    /**
     * @param skills the skills to set
     */
    public void setSkills(String skills) {
        this.skills = skills;
    }
    /**
     * @return the id
     */
    public int getId() {
        return id;
    }
    /**
     * @param id the id to set
     */

}

and here's the exception that gets thrown

   Exception in thread "main" javax.persistence.PersistenceException: Exception [EclipseLink-28019] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Deployment of PersistenceUnit [test] failed. Close all factories for this PersistenceUnit.
Internal Exception: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.IntegrityException
Descriptor Exceptions: 
---------------------------------------------------------

Exception [EclipseLink-93] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: The table [EVENT] is not present in this descriptor.
Descriptor: RelationalDescriptor(model.Speaker --> [DatabaseTable(SPEAKER)])

Exception [EclipseLink-41] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: A non-read-only mapping must be defined for the sequence number field.
Descriptor: RelationalDescriptor(model.Speaker --> [DatabaseTable(SPEAKER)])

Runtime Exceptions: 
---------------------------------------------------------

    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.createDeployFailedPersistenceException(EntityManagerSetupImpl.java:816)
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:756)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.getAbstractSession(EntityManagerFactoryDelegate.java:204)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.createEntityManagerImpl(EntityManagerFactoryDelegate.java:304)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:336)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:302)
    at Test.Tester.main(Tester.java:19)
Caused by: Exception [EclipseLink-28019] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Deployment of PersistenceUnit [test] failed. Close all factories for this PersistenceUnit.
Internal Exception: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.IntegrityException
Descriptor Exceptions: 
---------------------------------------------------------

Exception [EclipseLink-93] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: The table [EVENT] is not present in this descriptor.
Descriptor: RelationalDescriptor(model.Speaker --> [DatabaseTable(SPEAKER)])

Exception [EclipseLink-41] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: A non-read-only mapping must be defined for the sequence number field.
Descriptor: RelationalDescriptor(model.Speaker --> [DatabaseTable(SPEAKER)])

Runtime Exceptions: 
---------------------------------------------------------

    at org.eclipse.persistence.exceptions.EntityManagerSetupException.deployFailed(EntityManagerSetupException.java:238)
    ... 7 more
Caused by: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.IntegrityException
Descriptor Exceptions: 
---------------------------------------------------------

Exception [EclipseLink-93] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: The table [EVENT] is not present in this descriptor.
Descriptor: RelationalDescriptor(model.Speaker --> [DatabaseTable(SPEAKER)])

Exception [EclipseLink-41] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: A non-read-only mapping must be defined for the sequence number field.
Descriptor: RelationalDescriptor(model.Speaker --> [DatabaseTable(SPEAKER)])

Runtime Exceptions: 
---------------------------------------------------------

    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.initializeDescriptors(DatabaseSessionImpl.java:689)
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.initializeDescriptors(DatabaseSessionImpl.java:625)
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.initializeDescriptors(DatabaseSessionImpl.java:565)
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.postConnectDatasource(DatabaseSessionImpl.java:792)
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:736)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:239)
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:681)
    ... 5 more

I nearly have zero experience in this topic so please provide as much detailed info as you can :)

here's the session entity guys

package model;

import java.io.Serializable;
import java.sql.Date;

import javax.persistence.*;
import javax.xml.bind.annotation.XmlRootElement;

@Entity
@Table (name="session")
@NamedQueries({
@NamedQuery (name="findAllSessionForEvent",query="select e from Session e where e.event.id= :id"),
@NamedQuery (name="findSessionsBySpeakerName",query="select e from Session e where e.speaker.name=':name'"),
@NamedQuery (name="findSpeakerOfSessionBySessionId",query="select e.speaker.name from Session e where e.id=:id")})
@XmlRootElement

public class Session implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    @Id @GeneratedValue(strategy=GenerationType.SEQUENCE)
    private int id;
    private Date date;
    @ManyToOne
    @JoinColumn (name="eventID")
    //@Column(name="eventID")
    private Event event;
    @ManyToOne
    @JoinColumn (name="speakerID")
    //@Column(name="speakerID")
    private Speaker speaker;
    /**
     * @return the date
     */
    public Date getDate() {
        return date;
    }
    /**
     * @param date the date to set
     */
    public void setDate(Date date) {
        this.date = date;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public Speaker getSpeaker() {
        return speaker;
    }
    public void setSpeaker(Speaker speaker) {
        this.speaker = speaker;
    }
    public Event getEvent() {
        return event;
    }
    public void setEvent(Event event) {
        this.event = event;
    }


}

Upvotes: 1

Views: 5776

Answers (4)

Neil Stockton
Neil Stockton

Reputation: 11531

If you have Session.speaker then why is Speaker.speakerSessions having mappedBy=event ??? It should be "speaker". MappedBy basically says what is the field at the other side of the relation

Upvotes: 2

Andreas L.
Andreas L.

Reputation: 2933

Exception Description: The table [EVENT] is not present in this descriptor.

Add

@Table(name="Schamaname.Tablename")

or

@Table(name = "Tablename", schema = "Schamaname")

Add getter and setter for id. If you get NullPointerException initialize id with constructor

public Speaker (int id) {
    this.id = id
}

or change int to Integer, because int cannot be "null" in java, but as far it is primary key it should never be null in database.

You might also need @NamedQueries.

Upvotes: 0

Dhruv Rai Puri
Dhruv Rai Puri

Reputation: 1375

Error says - "A non-read-only mapping must be defined for the sequence number field."

Try adding the setter for your 'Id' field in Speaker.java

Ie. Add this code to Speaker.java -

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

Upvotes: 0

zbig
zbig

Reputation: 3966

You have to have correct schema structure in your underlying database and you have to have correct mappings in your JPA entities.

For the correct schema you can start by generating the schema by the JPA vendor. You can achieve that by adding one property to your persistence.xml file:

  • If you are using EclipseLink:

    <property name="eclipselink.ddl-generation" value="create-tables" />

  • If your are using Hibernate:

    <property name="hibernate.hbm2ddl.auto" value="create" />

With them you should get rid of the A non-read-only mapping must be defined for the sequence number field. error. This error tells you that JPA provider doesn't have the table to generate Ids from.

Your second error The table [EVENT] is not present in this descriptor. could mean an issue with @OneToMany mapping to Session. Is Session an entity and does it have correct @ManyToOne mapping back to Speaker?

Upvotes: 1

Related Questions