2016-07-01 7 views
1

に、あなただけ行うことができます。Grailsの3.1 - 単一ブックを追加する場合は、複数のインサートドメイン

String author = 'John Smith' 
String title = 'First Book' 
def book = new Book(author: author, title: title) 
book.save(flush: flush, insert: true) 

は、入力された場合、私は、例えば、一度に本の数を追加したいと言います

String author = 'John Smith' 
String title = ['First Book', 'Second Book', 'Third Book'] 

1回の呼び出しですべての書籍をデータベースに保存するにはどうすればよいですか?

+0

'フラッシュは使用しないでください:true'をするとGrailsは、一度にすべてを送ってみましょう – doelleri

答えて

-1

A GroovyのSQLソリューション:最終的なコードは、ブログの著者は、このようなルックスになってしまった

def author = 'John Smith' 
def titles = ['First Book', 'Second Book', 'Third Book'] 

def bookClassMetadata = sessionFactory.getClassMetadata(Book) 

def bookTableName = bookClassMetadata.tableName 

def authorColumnName = bookClassMetadata.propertyMapping.getColumnNames('author')[0] 
def titleColumnName = bookClassMetadata.propertyMapping.getColumnNames('title')[0] 

def batchSize = 500 

def batchSQL = "INSERT INTO ${bookTableName} (${authorColumnName}, ${titleColumnName})" + 
       " VALUES (?,?)" 

def sql = new Sql(dataSource) 

sql.withBatch(batchSize, batchSQL) { preparedStatement -> 

    titles.each { title -> 

       preparedStatement.addBatch([author, title]) 
    } 
} 
0

このブログの投稿は役に立ちます:http://www.tothenew.com/blog/batch-processing-in-grails/。基本的には、バッチを保存する必要はありません。セッションのサイズが大きくなりすぎるのを気にする必要があります。

List batch = [] 
(0..50000).each { 
    Person person = new Person(....) 
    batch.add(person) 
    if (batch.size() > 1000) { 
     Person.withTransaction { 
      for (Person p in batch) { 
       p.save() 
      } 
     } 
     batch.clear() 
    } 
    session = sessionFactory.getCurrentSession() 
    session.clear()    
} 
関連する問題