簡體   English   中英

如何定義Java中的模型與數據庫的關系?

[英]How to define relationship between models in Java and Database?

我有三個模型(即Users,UsersImages,UserLocation)對應於數據庫中有三個表。 我將用戶作為所有者實體,因為如果用戶在那里,那么只有它的圖像和它的位置是可能的,因此定義了這種關系。

我有兩個疑問:

  1. 如果這是正確的想法和使所有者實體? 如果是這樣,
  2. 我在 class UserImages 中沒有任何 userId,但有用戶 class 的參考,那么如何根據 userId 添加或更新或刪除 userImages。
  3. 如果這是錯誤的,那么建立這三個模型之間關系的正確方法是什么。
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
}

誰能幫我消除這個疑問??

謝謝

1.如果這是正確的想法和制作所有者實體?

是的,你的方法是正確的。

2. 我在 class 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是單向還是雙向關系。 它們之間有優點和缺點,並且像往常一樣,選擇因用途而異。 從我看到的情況來看,您希望在這里有雙向的,因此在實體之間提供同步方法(添加和刪除)至關重要。

  1. 就“所有者實體”而言,您必須告訴 hibernate 誰是關系的所有者,即誰擁有外鍵的引用。 您可以使用@JoinColumnmappedBy來實現,雙向使用兩者。
@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
}
  1. 如果您的Users實體是持久的,那么當您從userImagesList中刪除一些圖像時,它將與數據庫同步。 當負責從列表中刪除該圖像的方法完成時(或者當您制作entityManager.flush()時),該圖像將從數據庫中刪除,因為CascadeType 在雙向映射中刪除應該由您的同步刪除方法完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM