当前位置: 首页 > 知识库问答 >
问题:

为什么@manytone或@OnetoMany会在SpringBoot中产生问题

华善
2023-03-14

我在后端应用程序中定义了一些实体,它们有两个@manytone和@OneToMany关系,但在psequel中每次执行一个实体时,每个外键和主键关系都会创建额外的结构。我在执行时看到这个异常,我不知道如何恢复

HiberNate:创建表user_locations(user_idint4不为空,locations_idint4不为空)HiberNate:更改表(如果存在)location_user_id添加约束FKfsq9me9k3dj93oujbfgplkfrx外键(user_id_id)引用用户2019-04-08 15:18:29.001WARN 2023 --- [ main]o. h. t. s. i. ExceptionHandlerLoggedImpl: GenerationTarget遇到异常接受命令:执行DDL“更改表(如果存在)时出错location_user_id通过JDBC语句添加约束FKfsq9me9k3dj93oujbfgplkfrx外键(user_id_id)引用用户”

org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "alter table if exists location_user_id add constraint

FKfsq9me9k3dj93oujbfgplkfrx外键(用户id)通过JDBC语句引用“用户”

以下是我的用户表的外观:

@Entity
public class User {
    private String gmailToken;
    private String emailAddress;

    @Id
    private int Id;

    @ManyToMany
    private List<Location> locations;

}

位置实体看起来像这样:

@Entity
public class Location {

    private String name;
    private String country;
    private String countryCode;
    private Point geoCordinates;
    private double googleRating;
    private String phoneNumber;
    private ArrayList workingHours = new ArrayList<WorkingHours>();

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int Id;
    @ManyToMany
    private List<User> userId;

}

这里有什么我遗漏的吗。

编辑后添加:

我已将用户实体更改为如下所示:

public class User {
    private String gmailToken;
    private String emailAddress;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int Id;

    @OneToMany(cascade=CascadeType.ALL)
    @JoinColumn(name="USER_ID")
    private List<Location> locations;

    @OneToMany(cascade=CascadeType.ALL)
    @JoinColumn(name="USER_ID")
    private List<ReviewRequest> reviewRequests;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name="USER_ID")
    private List<Response> responseForRequests;

    public User(String gmailToken){
        this.gmailToken =gmailToken;
    }
}

位置实体如下所示:

公共类位置{

private String name;
private String country;
private String countryCode;
private Point geoCordinates;
private double googleRating;
private String phoneNumber;
private ArrayList workingHours = new ArrayList<WorkingHours>();

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int Id;

@ManyToMany(mappedBy = "location")
private List<User> userId;

@OneToMany(mappedBy = "location")
private List<Customer> customerId;

@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="LOCATION_ID")
private List<ReviewRequest> reviewId;

}

我仍然面临在给定的User表中创建单个表和创建外键列的问题。

看起来mappedBy和@JoinColumn似乎不正确?

共有1个答案

太叔鹏云
2023-03-14

1) 您应该在关系的拥有方指定@JoinTable(除非您对hibernate命名默认值感到满意)

2) 通过在其中一个实体上添加mappedBy来指定拥有方:

@ManyToMany
private List<Location> locations;
 类似资料:
  • 我观察到库函数,当它在循环中被调用一次时,它几乎总是产生正数。

  • 我不明白为什么< code>gcc -S -m32会产生这些特定的代码行: C 代码: 它给出以下输出:

  • 当我评论tx:annotation-drive时,一切都很好,但是带有@transactional注释的method不起作用。我做错了什么? 我的年级依赖关系:

  • 问题内容: 今天早上,Maven开始抱怨此错误: 奇怪的是,我正在使用JDK 7,并且此代码已经构建了好几周了。我只是将m2e与默认POM一起使用,而未指定编译器版本。 这是我的Maven版本信息: 我可以这样使用Maven编译器插件解决它: 仍然,我想了解为什么Maven突然开始行为异常并需要使用编译器插件。 问题答案: 这很可能是环境问题,而不是Maven问题(即,您的JAVA_HOME环境变

  • 在测试CRC实现时,我注意到0x01的CRC通常(?)似乎是多项式本身。然而,当试图手动进行二进制长除法时,我总是以丢失多项式的前导“1”告终,例如,当消息为“0x01”和多项式“0x1021”时,我将得到 通过查看https://en.wikipedia.org/wiki/computation_of_cyclic_redundancy_checks,我可以看到使用生成多项式离开移位寄存器的高位