동작은 MySQL 세션 변수 sql_mode
에 따라 다릅니다. 연결 중에 변수를 변경하고 나중에 원래 값으로 재설정 할 수 있습니다. 내 시스템에서 sql_mode
의 기본값은 다음과 같습니다
SELECT @@sql_mode;
-- REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY,ANSI,NO_AUTO_VALUE_ON_ZERO,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,PAD_CHAR_TO_FULL_LENGTH
당신은
SET SESSION sql_mode='...'
와 값을 업데이트 항목
STRICT_ALL_TABLES
을 제거 프로그램에서이 결과를 분석 명령문을 실행하고 마지막에 변수를 재설정 할 수 있습니다
트랜잭션. @ ripper234에 의해
편집 : 사람이 너무 경사 인 경우
private static final disableMysqlStrictMode =
((String)Play.configuration.get("db.url")).contains("mysql://");
...
String originalSqlMode = null;
try {
if (disableMysqlStrictMode) {
// Strip away mysql's "strict mode" for this transaction - in case one of the columns is truncated, we don't want the entire tx to fail
// http://stackoverflow.com/a/10606085/11236
Query query = JPA.em().createNativeQuery("SELECT @@sql_mode;");
originalSqlMode = (String)query.getSingleResult();
String newSqlMode = originalSqlMode
.replace("STRICT_ALL_TABLES", "")
.replace("STRICT_TRANS_TABLES", "")
.replace(",,", ",");
JPA.em().createNativeQuery("SET SESSION sql_mode=?").setParameter(1, newSqlMode).executeUpdate();
}
// Save my entity here
obj.save();
} finally {
if (originalSqlMode != null) {
// Restore original sql_mode
JPA.em().createNativeQuery("SET SESSION sql_mode=?").setParameter(1, originalSqlMode).executeUpdate();
}
}
그것은 더 예쁜 형태로 포장 할 수 있습니다 : 여기
내가이 답변의 정신에 쓴 코드입니다.
감사합니다. 사용을 종료 한 코드를 포함하도록 답을 편집했습니다. – ripper234