오전 새로운 매핑 문제 (EclipseLink가), 나는 예외 결국 개체를 저장하려고 할 때 내가, superclass Student
및 subclass 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
예 해당 열 이름의 문제, 예외가 사라졌지만 학생 ID가 책 테이블에 유지되지 않고 student_id 값이 0 인 경우 값이 부모 테이블 Student에서 가져 오지 않았습니다. –
Student Entity를 참조하는 BOOK 클래스에 학생 객체가 이미 있으므로 BOOK 테이블에 학생 ID가 필요하지 않습니다. 이런 종류의 문제를 피하기 위해 JPA reverse enginneing 도구를 사용하십시오 (Entity 클래스 생성). – DeepInJava