![](/img/trans.png)
[英]Spring Data JPA + Hibernate do execute save methods, but don't execute insert/update statements
[英]Spring data jpa collection don`t update
嗨,我有 2 個實體:部門和用戶。
我找到了兩個實體並想將一個添加到另一個但如果我將用戶添加到部門,則用戶的部門 = null。 如果相反,則 List = null。 如何正確執行此操作?
@Entity
@Table(name = "department")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Department {
@Id
@GenericGenerator(name = "uuid2", strategy = "uuid2")
@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "uuid2")
@Column(length = 36, nullable = false, updatable = false)
private UUID id;
@Column(name = "name", nullable = false)
private String name;
@Column(name = "description", nullable = false)
private String description;
@OneToMany(mappedBy = "department", cascade = CascadeType.ALL)
private List<User> users = new ArrayList<>();
}
@Entity
@Table(name = "user")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User {
@Id
@GenericGenerator(name = "uuid2", strategy = "uuid2")
@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "uuid2")
@Column(length = 36, nullable = false, updatable = false)
private UUID id;
private String firstName;
private String lastName;
private Integer age;
@ManyToOne
private Department department;
@ManyToMany
@JoinTable(
name = "device_devices",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "device_id"))
Set<Device> devices = new HashSet<>();
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return Objects.equal(id, user.id);
}
@Override
public int hashCode() {
return Objects.hashCode(id);
}
}
和服務
@Override
@Transactional
public void addUserToDepartment(UUID departmentId,UUID userId){
Department department = departmentRepository.findById(departmentId).orElseThrow(DepartmentNotFoundException::new);
User user = userRepository.findById(userId).orElseThrow(UserNotFoundException::new);
department.getUsers().add(user);
//user.setDepartment(department);
}
在我看來,將用戶添加到部門並同時將部門添加到用戶是不正確的。 他們必須把自己拉起來。 幫我
雙向關系必須由您手動維護,幕后沒有魔術可以為您處理。
在服務代碼中處理它的另一種方法是增強連接屬性的設置器來處理它,例如在用戶端:
public void setDepartment(Department department) {
this.department = department;
department.getUsers().add(this);
}
有關文檔,請參見此處。
這就是為什么你有mappedBy
屬性。 它向 hibernate 暗示當您有雙向關聯時,哪一方將負責這些映射。
所以考慮你的配置
public class Department {
@OneToMany(mappedBy = "department", cascade = CascadeType.ALL)
private List<User> users = new ArrayList<>();
...
}
然后僅在外勤部門的用戶上設置映射就足夠了
@Override
@Transactional
public void addUserToDepartment(UUID departmentId,UUID userId){
Department department = departmentRepository.findById(departmentId).orElseThrow(DepartmentNotFoundException::new);
User user = userRepository.findById(userId).orElseThrow(UserNotFoundException::new);
//department.getUsers().add(user); You don't need this.
user.setDepartment(department); This here is enough for hibernate!
}
正如 hibernate 文檔所指出的那樣,為了在需要手動更新雙方的方法中正常使用 java。 這意味着如果您僅更新一側,則更改將保留在數據庫級別,但在 java 級別上,您的其他實例將不會與這些更改同步。
在hibernate文檔中查看以下示例(示例 297 ,示例 298 )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.