(Hibernate,mysql)引起:java.sql.SQLException:字段'id'没有默认值

时间:2017-11-24 02:44:47

标签: mysql hibernate foreign-keys h2

我有一个在H2数据库上运行的应用程序,而Hibernate是ORM工具。目前,我正在更改此应用程序以使用mysql数据库而不是H2数据库,而在执行此操作时,我在保存flagjp实体时遇到此问题。

以下是导致此问题的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;

第三实体

@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;

在研究这个问题时,我能够发现这是由于在hibernate生成DDL时没有在数据库中设置自动增量的FlagJP表模式。

这是FlagJP的DDL

enter image description here

如果我尝试通过执行sql查询手动设置自动增量,则mysql会抛出此错误。

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解决这个问题。

提前感谢任何建议

更新:

这是我正在使用的序列生成器的代码

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

}

1 个答案:

答案 0 :(得分:0)

在mysql

中使用auto_increment字段ID尝试以下代码
  @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long flagId;

如果您无法为flagId添加auto_increment,请删除foreignKey FK_sk95esyf1n0gt1qqmlmdmq0uw,然后添加auto_increment并再次添加外键