2014-09-19 2 views
0

오전 새로운 매핑 문제 (EclipseLink가), 나는 예외 결국 개체를 저장하려고 할 때 내가, superclass Studentsubclass Book이, ManyToOne unidirectional mapping를 사용하는 것을 시도하고, 세부 사항은은 EclipseLink JPA ManyToOne 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; 
    } 


} 

메인 클래스 인 상위 클래스이다 수행중인 알 수없는 열 예외가 발생합니다.

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 테이블에서 확인 열 "BOOK_NAME은"나는 그것이 도움이되기를 바랍니다

데이터베이스 올바른지 확인!

+0

예 해당 열 이름의 문제, 예외가 사라졌지만 학생 ID가 책 테이블에 유지되지 않고 student_id 값이 0 인 경우 값이 부모 테이블 Student에서 가져 오지 않았습니다. –

+0

Student Entity를 참조하는 BOOK 클래스에 학생 객체가 이미 있으므로 BOOK 테이블에 학생 ID가 필요하지 않습니다. 이런 종류의 문제를 피하기 위해 JPA reverse enginneing 도구를 사용하십시오 (Entity 클래스 생성). – DeepInJava

0

private int studentID;에 예약 클래스 변경 private String studentID; 또한 각각의 getter 및 setter를 변경합니다.

+0

데이터 유형을 int로 수정했지만 여전히 동일한 문제입니다. –

+0

데이터베이스에 동일한 이름으로 book_name 필드가 있는지 확인하십시오. 그리고 데이터베이스에 이미 존재하는 이야기가 없으며 JPA가 자체적으로 테이블을 만들도록하는 것이 좋습니다. – Ankush

+0

데이터베이스에서 열 이름이 잘못되어 수정되었습니다. –

0

엔티티가 잘 작동합니다. 열 이름의 문제입니다. DDL을 확인하려면

<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>과 함께 사용할 수 있습니다.

는 @Sanket Pipariya 이미 학생 개체 (도서 테이블에서 'student_id'열)을 가지고 있기 때문에 당신이

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

필요하지 않습니다, 말했듯이. Book 클래스의 Student 특성에 insertable=false을 사용하고 있으므로 Student 특성과 함께 Book 개체를 유지하면 Book 테이블의 student_id 열이 null이됩니다.