H2 데이터베이스에서 실행중인 응용 프로그램이 있고 Hibernate가 ORM 도구입니다. 현재,이 응용 프로그램을 H2 데이터베이스 대신 mysql 데이터베이스를 사용하도록 변경하고 있으며이 작업을 수행하는 동안 flagjp 항목을 저장할 때이 문제가 발생했습니다.(Hibernate, mysql) 원인 : java.sql.SQLException : 'id'필드에 기본값이 없습니다.
다음은이 문제를 일으킨 FlagJP 항목입니다. 여기
@Entity
public class FlagJP extends BaseModelJP {
@Id
@GeneratedValue(generator = "IdOrGenerated")
@GenericGenerator(name = "IdOrGenerated", strategy = "com.jp.menu.api.model.JPSequenceGenerator")
private Long flagId;
private String flagKey;
@OneToMany(mappedBy="flag", cascade = CascadeType.ALL)
private List<FlagLangJP> flagLangs = new ArrayList<>();
@ManyToOne
private FlagCategoryJP flagCategory;
이
@Entity
public class FlagLangJP extends BaseModelJP {
@Id
@GeneratedValue(generator = "IdOrGenerated")
@GenericGenerator(name = "IdOrGenerated", strategy = "com.jp.menu.api.model.JPSequenceGenerator")
private Long id;
private String languageCode;
private String flagName;
private String flagDescription;
@ManyToOne
private FlagJP flag;
셋째 엔티티
@Entity
public class FlagCategoryJP extends BaseModelJP {
@Id
@GeneratedValue(generator = "IdOrGenerated")
@GenericGenerator(name = "IdOrGenerated", strategy = "com.jp.menu.api.model.JPSequenceGenerator")
private Long flagCategoryId;
private String flagCategoryName;
@OneToMany(mappedBy = "flagCategory")
private List<FlagJP> flags;
이 문제를 조사하는 동안 FlagJP
두 번째 개체에 대한 관련 엔티티, 나는 알아낼 수 있었다 최대 절전 모드 생성시 데이터베이스에 자동 증가가 설정되지 않은 FlagJP 테이블 스키마가 원인입니다. DDL. 그때 MySQL은이 오류가 발생, 수동으로 SQL 쿼리를 실행하여 자동 증가를 설정하려고하면
여기 FlagJP
의 DDL이다.
Operation failed: There was an error while applying the SQL script to the database.
ERROR 1833: Cannot change column 'flagId': used in a foreign key constraint 'FK_sk95esyf1n0gt1qqmlmdmq0uw' of table 'butterfly_emenu.flaglangbpa'
SQL Statement:
제 질문은 H2 데이터베이스를 사용할 때이 문제가 발생하지 않습니다. 데이터베이스가 MySQL 일 때 최대 절전 모드를 사용하여이 문제를 해결하는 방법. 어떤 조언에 미리
감사
업데이트 : 여기
는 MySQL의에서 내가public class JPSequenceGenerator extends IdentityGenerator {
private static final Logger logger = LoggerFactory.getLogger(JPSequenceGenerator.class);
@Override
public Serializable generate(SessionImplementor session, Object object) throws HibernateException {
Serializable id = session.getEntityPersister(null, object).getClassMetadata().getIdentifier(object, session);
if (id == null) {
id = super.generate(session, object);
}
return id;
}
}
이 순서는 ID가 null을 생성하거나 테이블에 제대로 저장하지 않을 때 발생합니다. –