您好我正在撰写我的第一个JPA项目之一,而且我在这个领域有点新手,所以请尽量简化内容:) 这是实体之一
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
*/
}
这里是被抛出的异常
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
我几乎没有这方面的经验,所以请提供尽可能详细的信息:)
这是会话实体人员
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;
}
}
答案 0 :(得分:2)
如果你有Session.speaker
,为什么Speaker.speakerSessions
有 mappedBy = event ???它应该是“扬声器”。 MappedBy基本上说明了关系另一边的字段是什么
答案 1 :(得分:1)
您必须在基础数据库中具有正确的架构结构,并且必须在JPA实体中具有正确的映射。
对于正确的架构,您可以从JPA供应商生成架构开始。您可以通过向persistence.xml文件添加一个属性来实现此目的:
如果您使用的是EclipseLink:
<property name="eclipselink.ddl-generation" value="create-tables" />
如果你正在使用Hibernate:
<property name="hibernate.hbm2ddl.auto" value="create" />
使用它们你应该摆脱A non-read-only mapping must be defined for the sequence number field.
错误。此错误告诉您JPA提供程序没有从中生成ID的表。
您的第二个错误The table [EVENT] is not present in this descriptor.
可能意味着@OneToMany
映射到Session
的问题。会话是一个实体,是否有正确的@ManyToOne
映射回Speaker
?
答案 2 :(得分:0)
错误说 - &#34;必须为序列号字段定义非只读映射。&#34;
尝试为您的&#39; Id&#39;添加setter。 Speaker.java中的字段
IE中。将此代码添加到Speaker.java -
public void setId(int id) {
this.id = id;
}
答案 3 :(得分:0)
异常说明:此描述符中不存在[EVENT]表。
添加
@Table(name="Schamaname.Tablename")
或
@Table(name = "Tablename", schema = "Schamaname")
为id添加getter和setter。如果你得到NullPointerException初始化id与构造函数
public Speaker (int id) {
this.id = id
}
或将int更改为Integer,因为int不能是&#34; null&#34;在java中,但它是主键,它在数据库中永远不应为null。
您可能还需要@NamedQueries。