2014-09-19 6 views
0

новичок в JPA (EclipseLink), пытаюсь использовать ManyToOne unidirectional mapping, у меня есть superclass Student и subclass Book, когда я пытаюсь сохранить объект я в конечном итоге с исключениями, подробности приведены нижеEclipseLink JPA ManyToOne отображение проблема

Студент является родительским классом

@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; 
    } 


} 

Главного класса, который выполняет операцию упорствовать, ш 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

Я могу видеть эту строку из вашего исключения StackTrace:

Unknown column 'book_name' in 'field list '

убедитесь, что колонка "book_name" в BOOK таблице правильно в базе данных

я надеюсь, что это помогает !!!

+0

Да, проблема с именем столбца, исключение прошло, но идентификатор студента не сохраняется в таблице книг, значение student_id равно 0, значение не извлекается из родительской таблицы Student. –

+0

вам не нужен идентификатор студента в таблице BOOK, так как у вас уже есть объект-ученик в классе BOOK, на который ссылается ученическая сущность. Используйте инструмент JPA reverse enginneing (чтобы генерировать классы Entity для вас), чтобы избежать такой проблемы. – DeepInJava

0

Изменения private String studentID; в классе книги для private int studentID;, а также изменить соответствующий геттер и сеттер.

+0

Я изменил тип данных на int, но все тот же вопрос. –

+0

Регистрация в базе данных имеет имя_имя_имя с тем же именем или нет. И рекомендуется, чтобы в базе данных уже не было сказок, и JPA создала таблицы самостоятельно. – Ankush

+0

Имя столбца было неправильным в базе данных, я изменил его. –

0

Сущность работает хорошо. Это проблема имени столбца. Чтобы убедиться, что ваш DDL, вы можете использовать с

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

Как сказал @Sanket Pipariya, вам не нужно

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

Поскольку у вас уже есть студенческий объект (столбец 'student_id' в книге таблицы). Вы используете insertable=false в атрибуте Student в Book Class, чтобы при сохранении объекта Book вместе с атрибутом Student столбец student_id в таблице Book был пустым.

Смежные вопросы