【问题标题】:How to solve duplicate column name exception in @OneToMany relationship如何解决@OneToMany 关系中的重复列名异常
【发布时间】:2019-07-18 06:27:08
【问题描述】:

我正在尝试 @JoinColumn 两个实体,名为 Customer 和 Account。一个客户可以有多个帐户,所以我认为在客户实体中使用 @OneToMany 是正确的。和帐户实体中的@ManyToOne。但是,它一直在控制台中给我 Duplicate 列名。 可以通过更改变量名来解决,但我不能简单地更改它,因为hibernate不会在DB中找到列名。即使添加@Column name 属性也不起作用。

有没有办法解决这个问题?

我尝试了以下方法:

  • 更改所有者实体。我把 @JoinColumn 放在 Account 实体中
  • 更改变量名。
  • 改用@OneToOne。
  • 按照示例中的正确方法,但重复映射异常没有解决。
  • 更改@Id 位置。

我已经在 DB 中尝试过 SQL 查询。查询有效,但我不知道如何在 hibernate jpa 中映射它。

Oracle 查询

SELECT a.USR_ID, a.USR_MGNT_NO, a.CUST_NO, a.ACCT_STATUS,
        b.ACCT_SEQ, b.ACCT_NO, b.CUST_NO, b.CUST_NM, b.SBJ_CD, b.ACCT_PRD_NM
FROM LB_USR_BASE a LEFT OUTER JOIN
 LB_ACCT_BASE b ON
a.CUST_NO=b.CUST_NO
WHERE a.USR_MGNT_NO=:usrMgtNo;

客户实体

@Entity
@Table(name = "CUSTOMER")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor

public class Customer implements Serializable{


    private static final long serialVersionUID = 1L;

    @Id
    private String custNo;

    private String usrId;
    private String usrMgntNo;
    private String acctStatus;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
    @JoinColumn(name = "custNo")
    private Set<Account> accounts = new HashSet<Account>();


}

账户实体

@Entity
@Table(name = "ACCOUNT")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Account {
    @Id
    private String acctId;
    private String acctNo;

    @ManyToOne
    private UsrBase user;
    private String sbjCd;
    private String custNo;

}

存储库

public interface CustAcctRepository extends JpaRepository<Customer, String>{

    List<Customer> findAcctByUsrMgntNo(String usrMgntNo);

}

服务/控制器

List<Customer> tes = CustAcctRepo.findAcctByUsrMgntNo("12345"));
Caused by: org.hibernate.DuplicateMappingException: Table [ACCOUNT] contains physical column name [cust_no] referred to by multiple physical column names: [cust_no], [custNo]

===========

编辑:

我修改了两个实体,如下:

public class Account {
    @Id
    private String acctSeq;
    private String acctNo;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "custNo",insertable = false, updatable = false)
    private UsrBase user;

}

public class Customer implements Serializable{


    private static final long serialVersionUID = 1L;

    @Id
    private String custNo;

    private String usrId;
    private String usrMgntNo;
    private String acctStatus;

    @OneToMany(cascade = CascadeType.ALL)
    private Set<AcctBase> accounts = new HashSet<AcctBase>();


}

【问题讨论】:

  • Account 中删除字段custNo:您已经拥有映射到同一列的ManyToOne,因此custNo 是多余的。并将 JoinColumn 注释移动到 Account 中的user 字段。 Customer.accounts 是相反的一面,因此不应定义关联的映射,因为它是 由 Account.user 映射的
  • @JBNizet 感谢您的帮助。我已经从 Account 中删除了 custNo。我也将 JoinColumn 移至用户字段。还是出现了同样的重复映射异常

标签: java oracle hibernate spring-boot jpa


【解决方案1】:

请参阅,在下面的代码中,您正在创建包含两个字段的映射:“user”和“custNo”。使用用户或 Account.custNo 进行映射

@OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
@JoinColumn(name = "custNo")
private Set<Account> accounts = new HashSet<Account>();

【讨论】:

  • 对不起我的错误..我现在删除了 custNo,但仍然出现同样的错误
  • 对于字段custNo,bot表中对应的列名是什么,你也可以分享setter方法。
  • 我认为数据库设计从一开始就是错误的(我只是使用遗留数据库)。没有 FK 可以连接两者,但我使用 custNo 作为连接器。 custNo 是相关的,但该字段未设置为 FK。在 Customer 表中,PK 是 usrId,但是如果我将 @Id 放在 usrId 字段中,则 where 查询将为 Select * from ... where Customer.usrId = Account.usrId,这是不可用的。对于Setter方法,我使用的是Lombok,所以没有设置任何Get Set方法,只是放了一些注解@Data@AllArgsConstructor@NoArgsConstructor
猜你喜欢
  • 1970-01-01
  • 2015-05-11
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
  • 1970-01-01
相关资源
最近更新 更多