2014-09-19 173 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列將爲空。