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;
がFlagJP
第二のエンティティの関連するエンティティ
@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;
第3のエンティティ
@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テーブルスキーマによって発生します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のときにhibernateを使ってこの問題を解決する方法。何かアドバイスを事前に
おかげ
アップデート:ここで
は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;
}
}
この問題は、シーケンスがnullを生成したか、テーブルに正しく格納されていないときに発生します。 –