java - JPA 生成的列名没有下划线(列名不匹配)
问题描述
我有一个复合 FK,它充当复合 PK。这个组合键的一部分是 Fk 到 users 表,文件如下:
public class LkUnitPK implements Serializable {
public LkUnitPK() {
}
private BigDecimal parentUnit;
private BigDecimal childUnit;
public LkUnitPK(BigDecimal parentUnit, BigDecimal childUnit) {
this.parentUnit = parentUnit;
this.childUnit = childUnit;
}
public boolean equals(Object other) {
if (other instanceof LkUnitPK) {
final LkUnitPK otherLkUnitPK = (LkUnitPK) other;
final boolean areEqual =
(otherLkUnitPK.parentUnit.equals(parentUnit) && otherLkUnitPK.childUnit.equals(childUnit));
return areEqual;
}
return false;
}
public int hashCode() {
return super.hashCode();
}
public void setParentUnit(BigDecimal parentUnit) {
this.parentUnit = parentUnit;
}
@Column(name = "parent_unit")
public BigDecimal getParentUnit() {
return parentUnit;
}
public void setChildUnit(BigDecimal childUnit) {
this.childUnit = childUnit;
}
@Column(name = "child_unit")
public BigDecimal getChildUnit() {
return childUnit;
}
}
用户单元如下所示:
@Entity
@Table(name="LK_UNIT"
,catalog="ooo"
)
public class LkUnit {
public LkUnit() {
super();
}
@Column(name = "unit_name")
private String unitName;
@Column(name = "active")
private BigDecimal active;
@EmbeddedId
private LkUnitPK id;
@OneToMany(fetch = FetchType.EAGER, mappedBy="lkUnit")
private Set<UsersUnit> usersUnit;
//////////////..
}
用户单位PK:
public class UsersUnitPK implements Serializable{
public UsersUnitPK() {
super();
}
private LkUnitPK lkUnitPk;
private BigDecimal userId;
public void setLkUnitPk(LkUnitPK lkUnitPk) {
this.lkUnitPk = lkUnitPk;
}
public LkUnitPK getLkUnitPk() {
return lkUnitPk;
}
public void setUserId(BigDecimal userId) {
this.userId = userId;
}
public BigDecimal getUserId() {
return userId;
}
}
用户单位:
@Entity
@Table(name = "USERS_UNIT", catalog="ooo")
public class UsersUnit implements Serializable {
public UsersUnit() {
super();
}
@EmbeddedId
private UsersUnitPK id;
@MapsId("lkUnitPk")
@JoinColumns({
@JoinColumn(name="parent_unit", referencedColumnName="parentUnit"),
@JoinColumn(name="child_unit", referencedColumnName="childUnit")
})
@ManyToOne
private LkUnit lkUnit;
@ManyToOne(fetch = FetchType.LAZY)
@MapsId("userId")
@JsonBackReference
private User user;
public void setId(UsersUnitPK id) {
this.id = id;
}
public UsersUnitPK getId() {
return id;
}
public void setLkUnit(LkUnit lkUnit) {
this.lkUnit = lkUnit;
}
public LkUnit getLkUnit() {
return lkUnit;
}
public void setUser(User user) {
this.user = user;
}
public User getUser() {
return user;
}
}
用户:
@Entity
@Table(name = "USERS", catalog="ooo")
@JsonInclude(Include.NON_NULL)
public class User {
private BigDecimal id;
...///...
private Set<UsersUnit> usersUnit;
@Id
@Column(name="id")
public BigDecimal getId() {
return id;
}
public void setId(BigDecimal id) {
this.id = id;
}
public void setUsersUnit(Set<UsersUnit> usersUnit) {
this.usersUnit = usersUnit;
}
@Column
@OneToMany(fetch = FetchType.EAGER,mappedBy = "user",cascade = {CascadeType.ALL})
@JsonManagedReference
public Set<UsersUnit> getUsersUnit() {
return usersUnit;
}
////
}
我得到如下运行时异常: 引起:java.sql.SQLSyntaxErrorException:ORA-00904:“LKUNIT1_”。“PARENTUNIT”:标识符无效
SELECT
usersunit0_.user_id AS user_id1_6_0_,
usersunit0_.child_unit AS child_unit0_6_0_,
usersunit0_.parent_unit AS parent_unit0_6_0_,
usersunit0_.child_unit AS child_unit0_6_1_,
usersunit0_.parent_unit AS parent_unit0_6_1_,
usersunit0_.user_id AS user_id1_6_1_,
usersunit0_.child_unit AS child_unit2_6_1_,
usersunit0_.parent_unit AS parent_unit3_6_1_,
lkunit1_.childunit AS childunit1_0_2_,
lkunit1_.parentunit AS parentunit2_0_2_,
lkunit1_.active AS active3_0_2_,
lkunit1_.unit_name AS unit_name4_0_2_
FROM
users_unit usersunit0_
INNER JOIN lk_unit lkunit1_ ON usersunit0_.child_unit = lkunit1_.childunit
AND usersunit0_.parent_unit = lkunit1_.parentunit
WHERE
usersunit0_.user_id = :1
从上面看,lk_unit 表中的这两行应该有下划线。
lkunit1_.child_unit AS childunit1_0_2_,
lkunit1_.parent_unit AS parentunit2_0_2_,
我在两个 getter 上都添加了 @columns,尝试了字段级别(但得到了 @mapsId 未提及的错误),在类上添加了 @embedded 但似乎没有任何效果。
有人可以告诉我这里出了什么问题吗?为什么下划线会错过 lk_unit 表?
解决方案
您有没有下划线的 JoinColumns:
@JoinColumns({
@JoinColumn(name="parent_unit", referencedColumnName="parentUnit"),
@JoinColumn(name="child_unit", referencedColumnName="childUnit")
})
应该:
@JoinColumns({
@JoinColumn(name="parent_unit", referencedColumnName="parent_unit"),
@JoinColumn(name="child_unit", referencedColumnName="child_unit")
})
推荐阅读
- c# - 如何理解此函数以接受数字作为输入并反转它们?
- xml - XSLT 合并节点
- javascript - 带有 React Navigation 的 React Native 固定页脚
- python - Python Gmail API 不会将 labelIds 参数传递给 List 方法
- c++ - 如何访问动态对象数组中的私有成员变量?
- react-native - 如何在没有导航的情况下创建抽屉菜单?
- c# - JSON-RPC API 的 C# 客户端
- reactjs - 如何在componentWillUnmount中删除scrollIntoView
- firebase - 扑动 firebase 数据库和 ListView 构建器问题
- android - 如何执行我的 overridePendingTransition?