2016-07-01 12 views
1

Wenn ein einzelnes Buch hinzufügen, können Sie einfach tun:Grails 3.1 - Mehrere Einsätze in Domäne

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

sagen, dass ich auf einmal mehrere Bücher hinzufügen möchten, zum Beispiel, wenn der Eingang ist:

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

Wie kann ich alle Bücher mit einem Anruf in die Datenbank speichern?

+0

Verwenden Sie nicht 'bündig: true' und lassen Grails sie alle auf einmal senden – doelleri

Antwort

-1

A Groovy SQL Lösung:

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

Dieser Blogbeitrag kann helfen: http://www.tothenew.com/blog/batch-processing-in-grails/. Grundsätzlich gibt es keine Stapelspeicherung und Sie müssen aufpassen, dass die Sitzung zu groß wird. Der endgültige Code endete der Blog-Autor mit sieht wie folgt auf:

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()    
}