【发布时间】: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