【问题标题】:A column in a table is referred to by multiple physical column names表中的一列被多个物理列名引用
【发布时间】:2020-01-01 14:53:51
【问题描述】:

我有一个使用 JPA 的 spring boot 项目,所以我尝试使用它们的 Id 将两个表映射到第三个表: 例如我有一个优惠券类,我有一个客户类我想将客户 ID 和优惠券 ID 放入第三个表中。

我有优惠券:

@Entity
@Table(name = "coupons")
public class Coupon {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)

    private long coup_id;
    private String title;
    private String start;
    private String end; 
    private int amount; 
    private String type;
    private String message; 
    private double price;
    private String image;

    @ManyToMany(mappedBy = "coupons")
    private List<Customer> customers;

我有客户:

@Entity
@Table(name="customers")
public class Customer {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)

    private int cust_id;

    @Size(min=1,message="is required")
    private String cust_name;

    @Size(min = 1, message = "is required")
    private String password;
     @ManyToMany(cascade = { CascadeType.ALL })
        @JoinTable(
            name = "customer_coupon", 
            joinColumns = { @JoinColumn(name = "cust_id") }, 
            inverseJoinColumns = { @JoinColumn(name = "coup_id") }
        )
    private List<Coupon> coupons;

我有连接表 customer_coupon:

这是我在启动项目时遇到的错误:

Caused by: org.hibernate.DuplicateMappingException: Table [coupons] contains physical column name [coup_id] referred to by multiple physical column names: [coupId], [coup_id]

我不知道它来自哪里,如果有人可以帮助我,我会很高兴!

【问题讨论】:

  • 尝试重命名 private long coup_id; to private long coupId;

标签: java mysql hibernate jpa mysql-workbench


【解决方案1】:

要消除歧义,请使用@Column 注释:

@Column(name = "coup_id")
private long coupId;

这样您可以随意命名您的 Java 属性,而不要让 JPA 单独解释它们。

【讨论】:

  • 你是从哪里得到这个私人的 long coupId 的?原始是私人的长政变id
  • 试过了,还是一样,在这篇文章之前我在所有东西上都有@Column,有错误,没有错误
  • @RomanSterlin 也许你应该在否决答案之前更深入地阅读 OP 的问题......从例外:referred to by multiple physical column names: [coupId], ... 。我不认为他在 camelCase 中命名了数据库列,因此在代码的某些部分中,他将 Coupon Id 变量定义为coupId
  • 对不起,请编辑你的答案,这样我就可以删除反对票。
【解决方案2】:

发现问题...抱歉。

还有另一个类 Company 也指的是 coupId

     @OneToMany(
            cascade = CascadeType.ALL,
            orphanRemoval = true
        )
 @JoinColumn(name = "coupId")
private List<Coupon> coupons = new ArrayList();

这是来自Company 类。

【讨论】:

  • 为什么会出现这个问题?
【解决方案3】:

我有同样的问题。

@Column(name = "coup_id") private long coupId;

db 表中的列名为coup_id

我删除了@Column 注释,并且开始工作了!就是这样。

Hibernate 将 xX 转换为 x_x 本身。

【讨论】:

    【解决方案4】:

    我遇到此问题的另一种情况是区分大小写。我在两个类中提到了一个列名作为 ownerid 和 ownerId。根据错误:表 [] 包含引用多个物理列名称 [ownerid] 和 [owner_id] 的逻辑列名称 [ownerid]。我最终花了很多时间搜索 owner_id。

    【讨论】:

      【解决方案5】:

      我有连接表,它也是实体,并且与两个表有 ManyToOne 关系,所以这不完全是这个问题,但可以帮助某人。

      @MapsId(property name) 添加到@ManyToOne 属性对我有用。

      【讨论】:

        猜你喜欢
        • 2019-01-26
        • 1970-01-01
        • 2021-05-19
        • 1970-01-01
        • 1970-01-01
        • 2012-06-06
        • 2012-04-07
        • 1970-01-01
        • 2017-06-03
        相关资源
        最近更新 更多