Так что я пытался понять это.
В SQL Server есть способ массового копирования с использованием sql, который они описывают здесь:
https://docs.microsoft.com/en-us/sql/connect/jdbc/using-bulk-copy-with-the-jdbc-driver?view=sql-server-2017#single-bulk-copy-operations
Они даже используют executeUpdate()
.
Я пытался сделать это с помощью EntityManager, однако всегда получаю следующее:
javax.persistence.TransactionRequiredException: Executing an update/delete query
Вот мой код:
@Service
@Transactional
public class UpdateService {
private EntityManager emPreStaging;
@PersistenceContext(unitName = "prestagingEntityManagerFactory")
public void setEmPreStaging(EntityManager emPreStaging) {
this.emPreStaging = emPreStaging;
}
@Async
public void insertData(String filePath) {
_log.info("[Update] Inserting data...");
try {
emPreStaging.createNativeQuery("BULK INSERT [test_table] FROM '" + filePath + "' WITH ( FIRSTROW = 2,FORMATFILE = 'C:\\csv\\location\\test.csv'").executeUpdate();
} catch (Exception e) {
_log.error("[Update] - Insert Data FAILED - " +e.getMessage());
} finally {
emPreStaging.close();
}
}
}
В настоящее время я использую org.springframework.transaction.annotation.Transactional
, но я также пробовал jpa's. Я попытался обернуть функцию, а не на уровне класса, но безрезультатно. Что я делаю неправильно?