我有一个在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
如果我尝试通过执行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;
}
}
答案 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并再次添加外键