2014-09-19 102 views
0

是新来的JPA(EclipseLink的),想使用ManyToOne unidirectional mapping,我有superclass Studentsubclass Book,当我尝试保存我结束了异常的对象时,详情如下的EclipseLink JPA多对一映射问题

学生是父类

@Entity 
@Table(name="STUDENT") 
@TableGenerator(name="student_s", initialValue=1) 
public class Student { 
    @Id 
    @Column(name="student_id") 
    @GeneratedValue(strategy=GenerationType.TABLE ,generator="student_s") 
    private int studentID; 

    @Column(name="full_name",nullable=false) 
    private String student_name; 

    public int getStudentID() { 
     return studentID; 
    } 

    public void setStudentID(int studentID) { 
     this.studentID = studentID; 
    } 

    public String getStudent_name() { 
     return student_name; 
    } 

    public void setStudent_name(String student_name) { 
     this.student_name = student_name; 
    } 

} 

书是儿童类

@Entity 
@Table(name="BOOK") 
@TableGenerator(name="book_s", initialValue=1) 
public class Book { 
    @Id 
    @Column(name="book_id") 
    @GeneratedValue(strategy=GenerationType.TABLE ,generator="book_s") 
    private int bookID; 

    @Column(name="book_name") 
    private String bookName; 

    @Column(name="student_id") 
    private String studentID; 

    @ManyToOne(cascade=CascadeType.ALL) 
    @JoinColumn(name="student_id",referencedColumnName="student_id",insertable=false,updatable=false) 
    private Student student; 

    public int getBookID() { 
     return bookID; 
    } 

    public void setBookID(int bookID) { 
     this.bookID = bookID; 
    } 

    public String getBookName() { 
     return bookName; 
    } 

    public void setBookName(String bookName) { 
     this.bookName = bookName; 
    } 

    public String getStudentID() { 
     return studentID; 
    } 

    public void setStudentID(String studentID) { 
     this.studentID = studentID; 
    } 

    public Student getStudent() { 
     return student; 
    } 

    public void setStudent(Student student) { 
     this.student = student; 
    } 


} 

主类,其执行persist操作,W hile表演坚持未知列的异常抛出。

public class Main { 
    public static void main(String args[]){  
     Student student = new Student(); 
     student.setStudent_name("Prem"); 

     Book book = new Book(); 
     book.setBookName("The Best Laid Plan"); 
     book.setStudent(student); 

     EntityManagerFactory emf=Persistence.createEntityManagerFactory("premjpaeclipselink"); 
     EntityManager em = emf.createEntityManager(); 
     em.getTransaction().begin(); 
     em.persist(book); 
     em.getTransaction().commit(); 
     em.close(); 
     emf.close(); 
    } 
} 

例外:

]: sql: Connection(635083092)--INSERT INTO BOOK (book_id, book_name, student_id) VALUES (?, ?, ?) 
    bind => [351, The Best Laid Plan, null] 
[EL Fine]: sql: SELECT 1 
[EL Warning]: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'book_name' in 'field list' 
Error Code: 1054 
Call: INSERT INTO BOOK (book_id, book_name, student_id) VALUES (?, ?, ?) 
    bind => [351, The Best Laid Plan, null] 
Exception in thread "main" javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'book_name' in 'field list' 
Error Code: 1054 
Call: INSERT INTO BOOK (book_id, book_name, student_id) VALUES (?, ?, ?) 
    bind => [351, The Best Laid Plan, null] 
    at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:157) 
    at org.prem.jpa.eclipselink.Main.main(Main.java:31) 
Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'book_name' in 'field list' 
Error Code: 1054 
Call: INSERT INTO BOOK (book_id, book_name, student_id) VALUES (?, ?, ?) 
    bind => [351, The Best Laid Plan, null] 
    at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:331) 
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:900) 
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:962) 
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:631) 
    at org.eclipse.persistence.internal.databaseaccess.ParameterizedSQLBatchWritingMechanism.executeBatch(ParameterizedSQLBatchWritingMechanism.java:149) 
    at org.eclipse.persistence.internal.databaseaccess.ParameterizedSQLBatchWritingMechanism.executeBatchedStatements(ParameterizedSQLBatchWritingMechanism.java:134) 
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.writesCompleted(DatabaseAccessor.java:1836) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.writesCompleted(AbstractSession.java:4244) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.writesCompleted(UnitOfWorkImpl.java:5594) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.acquireWriteLocks(UnitOfWorkImpl.java:1646) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitTransactionAfterWriteChanges(UnitOfWorkImpl.java:1614) 
    at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.commitRootUnitOfWork(RepeatableWriteUnitOfWork.java:284) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitAndResume(UnitOfWorkImpl.java:1169) 
    at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:132) 
    ... 1 more 
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'book_name' in 'field list' 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
    at com.mysql.jdbc.Util.getInstance(Util.java:386) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1053) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2734) 
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359) 
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:890) 
    ... 13 more 

回答

1

我可以看到从你的异常堆栈跟踪这一行:

Unknown column 'book_name' in 'field list'

确保柱‘BOOK_NAME’在BOOK表是在数据库中正确

我希望它能帮助!

+0

是它与列名的问题,异常消失了,但学生ID没有保存在书本表中,student_id的值是0,该值不是从父表Student中提取的。 – 2014-09-19 04:19:29

+0

您不需要BOOK表中的学生ID,因为您已经在学生实体引用的BOOK类中拥有学生对象。使用JPA反向工具工具(为您生成实体类)来避免此类问题。 – DeepInJava 2014-09-19 04:21:10

0

变化private String studentID;在书类private int studentID;,改变相应的getter和setter。

+0

我修改了数据类型为int,但仍然是相同的问题。 – 2014-09-19 03:56:13

+0

签入数据库中的book_name字段是否存在相同的名称。并且建议您不要在数据库中存在传说,并让JPA自己创建表。 – Ankush 2014-09-19 04:02:38

+0

数据库中的列名是错误的,我修改了它。 – 2014-09-19 04:21:56

0

实体运行良好。这是列名的问题。为了确保你的DDL,你可以使用

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

正如@Sanket皮帕里耶说,你不需要

@Column(name="student_id") 
private String studentID; 

因为你已经有Student对象(在书籍表 'student_id数据' 一栏)。 您在Book类的Student属性中使用insertable=false,因此当您将Book对象与Student属性一起保存时,Book表中的student_id列将为空。