java 休眠外键问题:执行DDL“alter table...”时出错

qpgpyjmq  于 2023-09-29  发布在  Java
关注(0)|答案(5)|浏览(119)

我有一个非常简单的对象结构,它给了我一个无法解决的错误。我已经做了一堆搜索,我认为这一定是一个相当常见的用例,所以不确定问题是什么。我有这三个类:

@Entity
public class Widget {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int idd;
    private Date date;
    private String type;
    private int ownerId;

    @OneToOne(cascade = CascadeType.ALL)
    private Rating rating;

    @OneToMany(cascade = CascadeType.ALL)
    private List<Tag> tagList;

}

@Entity
public class Rating {
public enum ChartType  {RADAR, BAR, LINE, STAR};

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int ratingId;
private String name;

@Enumerated(EnumType.STRING)
private ChartType chartType;
private double normalizedValue;

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
private List<RatingComponent> componentList = new ArrayList<>();

public Rating() {
    buildNormalizedValue();
}
}

@Entity
public class RatingComponent {

@Id
@GeneratedValue()
private int compId;

private String name;
private double value;
private double maxValue;

}

当保存在DAO中时,我得到了我不太理解的错误,例如

2018-07-23 11:43:07,208 WARN o.h.t.s.i.ExceptionHandlerLoggedImpl [main] GenerationTarget encountered exception accepting command : 
Error executing DDL "alter table Rating_RatingComponent drop foreign key FKaudjguwlo1i8tm2jgli5bbnq6" via JDBC Statement
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "alter table Rating_RatingComponent drop foreign key FKaudjguwlo1i8tm2jgli5bbnq6" via JDBC Statement

上越

2018-07-23 11:43:07,644 WARN o.h.t.s.i.ExceptionHandlerLoggedImpl [main] GenerationTarget encountered exception accepting command : Error executing DDL "create table RatingComponent (compId integer not null, maxValue double precision not null, name varchar(255), value double precision not null, primary key (compId)) engine=InnoDB" via JDBC Statement
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "create table RatingComponent (compId integer not null, maxValue double precision not null, name varchar(255), value double precision not null, primary key (compId)) engine=InnoDB" via JDBC Statement

我的配置中有这些属性

<property name="hibernate.hbm2ddl.auto">create</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>

我认为我已经仔细地阅读了文档,并且认为这是一个非常直接的对象设计......关于如何解决的任何想法,以及我应该在文档中的哪里更仔细地研究以了解根本原因?
谢谢!2谢谢!

7gcisfzg

7gcisfzg1#

我使用了SQL保留字'order'作为实体名称,因此我得到了类似的错误。重命名它为我解决了它。看看你的实体名称,你有没有在其中使用任何保留字?

tktrz96b

tktrz96b2#

更换

<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>

通过

<property name="hibernate.dialect">org.hibernate.dialect.MySQL8InnoDBDialect</property>

将做的伎俩

ttvkxqim

ttvkxqim3#

我不得不删除创建所有的表,使其工作。还要检查是否使用任何保留字作为表名。

j1dl9f46

j1dl9f464#

我在@OneToMany关系中遇到了这个错误,选项是orphanRemoval = true。实际上,从JPA文档中可以看到:
是否将移除操作应用于已从关系中移除的实体,以及是否将移除操作级联到这些实体。
所以,如果你创建了一个表A,填充它,然后你想创建一个表B(当然,一开始是空的),用一个外键到表A,那么你会得到“alter table xxx drop foreign key”错误。
正在从以下位置删除属性:

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)

收件人:

@OneToMany(cascade = CascadeType.ALL)
ac1kyiln

ac1kyiln5#

在我的例子中,DB用户没有足够的权限使用reference命令修改表。提示堆栈跟踪有如下错误
原因:java.sql.SQLSyntaxErrorException:REFERENCES命令拒绝用户
更新数据库用户权限修复了该问题
也将更新作为ddl-auto使用
jpa:hibernate:ddl-auto:更新

相关问题