#java #hibernate #jpa #spring-data-jpa
Вопрос:
У меня есть составной FK, который действует как составной PK. Часть этого составного ключа является таблицей Fk для пользователей, и файлы выглядят следующим образом:
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) amp;amp; 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;
//////////////..
}
UsersUnitPK:
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;
}
}
UsersUnit:
@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;
}
}
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
Сверху эти 2 строки в таблице lk_unit должны иметь подчеркивания
lkunit1_.child_unit AS childunit1_0_2_,
lkunit1_.parent_unit AS parentunit2_0_2_,
Я добавил столбцы @на обоих получателях, попробовал уровни полей (но получил ошибку, что @MapsId не упоминается), добавил @embedded в класс, но, похоже, ничего не работает.
Может кто-нибудь сказать мне, что здесь происходит не так? почему подчеркивание должно отсутствовать в таблицах lk_unit?
Ответ №1:
У вас есть совместные имена без подчеркиваний:
@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")
})