[英]How to define relationship between models in Java and Database?
我有三個模型(即Users,UsersImages,UserLocation)對應於數據庫中有三個表。 我將用戶作為所有者實體,因為如果用戶在那里,那么只有它的圖像和它的位置是可能的,因此定義了這種關系。
我有兩個疑問:
class Users{
long id;
@OneToMany
List<UserImages> userImagesList;
@OneToOne
UserLocation userLocation;
// some other data members
// getters and setters
}
class UserImages{
long id;
@ManyToOne
Users usersObj;
// some other data members
// getters and setters
}
class UserLocation{
long id;
@OneToOne(mappedBy="userlocation")
Users usersObj;
// some other data members
// getters and setters
}
誰能幫我消除這個疑問??
謝謝
是的,你的方法是正確的。
UserImages
中沒有任何userId
,但有Users
class 的參考,那么如何根據userId
添加或更新或刪除userImages
由於您在UserImages
中有Users
的引用,因此您可以通過users
自己獲取userImages
。 Hibernate
將為您做到這一點。 如果您仍想通過userId
獲取userImages
,您也可以通過users.getId()
來獲取 - 這將為您提供userId
Spring-data
將自動為您提供此類服務方法 -
public interface UserImagesRepository extends CrudRepository<UserImages, Long> {
UserImages findById(long id);
}
或者您可以手動編寫自己的 -
@Repository
Public class YourServiceClass {
@PersistenceContext
private EntityManager em;
public UserImages getUserImageByUser(Users user) {
return em.createQuery("FROM UserImages WHERE usersObj.id = :userId")
.setParameter("userId", user.getId())
.getSingleResult();
}
}
首先你要決定在ORM層,即hibernate是單向還是雙向關系。 它們之間有優點和缺點,並且像往常一樣,選擇因用途而異。 從我看到的情況來看,您希望在這里有雙向的,因此在實體之間提供同步方法(添加和刪除)至關重要。
@JoinColumn
或mappedBy
來實現,雙向使用兩者。@Entity
@Table(name = "user")
class Users {
@Id
Long id;
@OneToMany(cascadeType = CascadeType.ALL)
@JoinColumn(name = "user_id") // here Users is the owning side
List<UserImages> userImagesList = new LinkedList<>();
@OneToOne
@JoinColumn(name = "user_id")
UserLocation userLocation;
void addUserImage(UserImage userImage) {
this.userImagesList.add(userImage);
userImage.setUser(this);
}
void removeUserImage(UserImage userImage) {
this.userImagesList.remove(userImage);
userImage.setUser(null);
}
// some other data members
// getters and setters
// hashCode and equals!!!
}
@Entity
@Table(name = "user_image")
class UserImages {
@Id
Long id;
@ManyToOne(mappedBy = "userImagesList")
Users usersObj;
// some other data members
// hashCode and equals!!!
// getters and setters
}
Users
實體是持久的,那么當您從userImagesList
中刪除一些圖像時,它將與數據庫同步。 當負責從列表中刪除該圖像的方法完成時(或者當您制作entityManager.flush()
時),該圖像將從數據庫中刪除,因為CascadeType
。 在雙向映射中刪除應該由您的同步刪除方法完成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.