2017-11-24 24 views
0

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

enter image description here

の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; 
    } 

} 
+0

この問題は、シーケンスがnullを生成したか、テーブルに正しく格納されていないときに発生します。 –

答えて

0

は、AUTO_INCREMENTフィールドIDを使用してコードの下に試してみてください使用していシーケンスジェネレータのためのコードである

@Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id") 
    private Long flagId; 

flにauto_incrementを追加できない場合は次に外部キーを削除するFK_sk95esyf1n0gt1qqmlmdmq0uw auto_incrementを追加して外部キーを再度追加する

+0

答えをありがとう、私は変更uを提案したが、問題はまだ存在する。 FKを削除してテーブルに変更するあなたのコメントに関して、私はこのアプローチが気に入らない。私は、DDLを休止状態のエンティティに基づいて生成したいだけで、データベースに手動で変更することなく動作させる必要があります。この場合の休止状態を取得する方法 – KItis

+0

@KItis Entityクラスでこの '@GeneratedValue(strategy = GenerationType.AUTO)'を指定し、hibernateを介してDDLを生成します。同じエラーが出ますか?試しましたか? –

+0

はい、私は同じことを試みました – KItis

関連する問題