2016-08-12 198 views
0

我想用Hibernate做一個簡單的一對多關係。想法是,一個訂單可以有很多訂單項目。我不知道爲什麼我會得到這個異常。我對Hibernate對象關係相當陌生。你能否指出這個程序是否存在配置問題。如果你讓我知道如何做一個這樣的映射在休眠,那會很好。謝謝!架構異常休眠一對多

訂購

package one_to_many; 

import java.util.List; 

import javax.persistence.CascadeType; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.OneToMany; 

@Entity 
public class Order { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int order_id; 
    private String name; 
    private String address; 

    @OneToMany(cascade = { CascadeType.ALL }, orphanRemoval = true, fetch = FetchType.LAZY) 
    @JoinColumn(name = "order_id", nullable = false) 
    private List<OrderItem> orderItems; 

    public Order() { 

    } 

    public Order(String name, String address, List<OrderItem> orderItems) { 
     this.name = name; 
     this.address = address; 
     this.orderItems = orderItems; 
    } 

    public int getOrder_id() { 
     return order_id; 
    } 

    public void setOrder_id(int order_id) { 
     this.order_id = order_id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getAddress() { 
     return address; 
    } 

    public void setAddress(String address) { 
     this.address = address; 
    } 

    public List<OrderItem> getOrderItems() { 
     return orderItems; 
    } 

    public void setOrderItems(List<OrderItem> orderItems) { 
     this.orderItems = orderItems; 
    } 

} 

OrderItem的

package one_to_many; 

import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 

@Entity 
public class OrderItem { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int orderItemId; 
    private String itemName; 
    private int quantity; 

    public int getOrderItemId() { 
     return orderItemId; 
    } 

    public void setOrderItemId(int orderItemId) { 
     this.orderItemId = orderItemId; 
    } 

    public String getItemName() { 
     return itemName; 
    } 

    public void setItemName(String itemName) { 
     this.itemName = itemName; 
    } 

    public int getQuantity() { 
     return quantity; 
    } 

    public void setQuantity(int quantity) { 
     this.quantity = quantity; 
    } 

    public OrderItem() { 

    } 

    public OrderItem(String itemName, int quantity) { 
     this.itemName = itemName; 
     this.quantity = quantity; 
    } 

    @Override 
    public String toString() { 
     return "OrderItem [orderItemId=" + orderItemId + ", itemName=" + itemName + ", quantity=" + quantity + "]"; 
    } 

} 

亞軍

package one_to_many; 

import java.util.ArrayList; 
import java.util.List; 

import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.cfg.Configuration; 

public class Runner { 

    public static void main(String[] args) { 

     SessionFactory sessionFactory = new Configuration().configure("/one_to_many/hibernate.cfg.xml") 
       .buildSessionFactory(); 
     Session session = sessionFactory.openSession(); 
     session.beginTransaction(); 

     List<OrderItem> list = new ArrayList<OrderItem>(); 

     list.add(new OrderItem("book", 2)); 
     list.add(new OrderItem("tshirt", 4)); 

     Order order = new Order("regular", "919 Ridge", list); 

     session.save(order); 

     session.close(); 
    } 

} 

錯誤

INFO: HHH000262: Table not found: Order 
Hibernate: 
    create table Order (
     order_id integer not null auto_increment, 
     address varchar(255), 
     name varchar(255), 
     primary key (order_id) 


    ) 
Aug 11, 2016 9:45:40 PM org.hibernate.tool.schema.internal.ExceptionHandlerLoggedImpl handleException 
WARN: GenerationTarget encountered exception accepting command : Unable to execute command [ 
     create table Order (
      order_id integer not null auto_increment, 
      address varchar(255), 
      name varchar(255), 
      primary key (order_id) 

    )] 
org.hibernate.tool.schema.spi.CommandAcceptanceException: Unable to execute command [ 
    create table Order (
     order_id integer not null auto_increment, 
     address varchar(255), 
     name varchar(255), 
     primary key (order_id) 
    )] 
    at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:63) 
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.applySqlString(SchemaMigratorImpl.java:573) 
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.applySqlStrings(SchemaMigratorImpl.java:557) 
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.createTable(SchemaMigratorImpl.java:345) 
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.performMigration(SchemaMigratorImpl.java:257) 
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.doMigration(SchemaMigratorImpl.java:137) 
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.doMigration(SchemaMigratorImpl.java:110) 
    at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:176) 
    at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:65) 
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:308) 
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:483) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:707) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:723) 
    at one_to_many.Runner.main(Runner.java:15) 
Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Order (
     order_id integer not null auto_increment, 
     address varcha' at line 1 
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:686) 
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:663) 
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:653) 
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:115) 
    at com.mysql.cj.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2041) 
    at com.mysql.cj.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:1994) 
    at com.mysql.cj.jdbc.StatementImpl.executeInternal(StatementImpl.java:890) 
    at com.mysql.cj.jdbc.StatementImpl.execute(StatementImpl.java:788) 
    at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:51) 
    ... 13 more 

Aug 11, 2016 9:45:40 PM org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl processGetTableResults 
INFO: HHH000262: Table not found: Order 
Aug 11, 2016 9:45:40 PM org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl processGetTableResults 
INFO: HHH000262: Table not found: Order 
Aug 11, 2016 9:45:40 PM org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl processGetTableResults 
INFO: HHH000262: Table not found: Order 
Aug 11, 2016 9:45:40 PM org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl processGetTableResults 
INFO: HHH000262: Table not found: Order 
Hibernate: 
    alter table OrderItem 
     add constraint FK1d77ns82kvwa2hwab9k7xcaog 
     foreign key (order_id) 
     references Order (order_id) 
Aug 11, 2016 9:45:40 PM org.hibernate.tool.schema.internal.ExceptionHandlerLoggedImpl handleException 
WARN: GenerationTarget encountered exception accepting command : Unable to execute command [ 
    alter table OrderItem 
     add constraint FK1d77ns82kvwa2hwab9k7xcaog 
     foreign key (order_id) 
     references Order (order_id)] 
org.hibernate.tool.schema.spi.CommandAcceptanceException: Unable to execute command [ 
    alter table OrderItem 
     add constraint FK1d77ns82kvwa2hwab9k7xcaog 
     foreign key (order_id) 
     references Order (order_id)] 
    at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:63) 
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.applySqlString(SchemaMigratorImpl.java:573) 
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.applySqlStrings(SchemaMigratorImpl.java:557) 
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.applyForeignKeys(SchemaMigratorImpl.java:516) 
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.performMigration(SchemaMigratorImpl.java:315) 
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.doMigration(SchemaMigratorImpl.java:137) 
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.doMigration(SchemaMigratorImpl.java:110) 
    at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:176) 
    at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:65) 
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:308) 
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:483) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:707) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:723) 
    at one_to_many.Runner.main(Runner.java:15) 
Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Order (order_id)' at line 4 
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:686) 
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:663) 
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:653) 
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:115) 
    at com.mysql.cj.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2041) 
    at com.mysql.cj.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:1994) 
    at com.mysql.cj.jdbc.StatementImpl.executeInternal(StatementImpl.java:890) 
    at com.mysql.cj.jdbc.StatementImpl.execute(StatementImpl.java:788) 
    at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:51) 
    ... 13 more 

Hibernate: 
    insert 
    into 

    Order (address 
    , name) 
values 
    (?, ?) 
Aug 11, 2016 9:45:40 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 
WARN: SQL Error: 1064, SQLState: 42000 
Aug 11, 2016 9:45:40 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 
ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Order (address, name) values ('919 Ridge', 'regular')' at line 1 
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not execute statement 
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:63) 
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:97) 
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:207) 
    at org.hibernate.dialect.identity.GetGeneratedKeysDelegate.executeAndExtract(GetGeneratedKeysDelegate.java:57) 
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:42) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2840) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3411) 
    at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81) 
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:619) 
    at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:273) 
    at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:254) 
    at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:299) 
    at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:318) 
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:275) 
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:182) 
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:113) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192) 
    at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177) 
    at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73) 
    at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:668) 
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:660) 
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:655) 
    at one_to_many.Runner.main(Runner.java:26) 
Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Order (address, name) values ('919 Ridge', 'regular')' at line 1 
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:686) 
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:663) 
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:653) 
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:115) 
    at com.mysql.cj.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2041) 
    at com.mysql.cj.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1827) 
    at com.mysql.cj.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2041) 
    at com.mysql.cj.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:1977) 
    at com.mysql.cj.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:4963) 
    at com.mysql.cj.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1962) 
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:204) 
    ... 22 more 
+0

您的問題是您的數據庫中的表沒有名稱順序。哪個站在你的堆棧跟蹤的第一行。你想要映射到哪張表?在你的情況下,你想使用'@ Table'註釋。你應該看看[Java Persistence Wikibook](https://en.wikibooks.org/wiki/Java_Persistence)。這是對JPA的一個很好的介紹。 – kaba713

+0

感謝您的回覆。我會看看它,它有幫助! –

回答

1

名稱'order'是mysql中的一個保留關鍵字。更改表名'訂單'。

+0

感謝您的回覆。這解決了這個問題。 –