【问题标题】:How to define relationship between models in Java and Database?如何定义Java中的模型和数据库之间的关系?
【发布时间】:2020-11-08 02:53:38
【问题描述】:

我有三个模型(即Users,UsersImages,UserLocation)对应于数据库中的三个表。我将用户作为所有者实体,因为如果用户在那里,那么只有它的图像和它的位置是可能的,因此定义了这种关系。

我有两个疑问:

  1. 如果这是正确的想法和制作所有者实体?如果是这样,
  2. 我在 UserImages 类中没有任何 userId,但有 Users 类的引用,那么如何根据 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
}

谁能帮我解开这个疑惑??

谢谢

【问题讨论】:

    标签: java database spring-boot hibernate spring-data-jpa


    【解决方案1】:

    首先你要决定在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。在双向映射中,删除应由您的同步删除方法完成。

    【讨论】:

      【解决方案2】:

      1。如果这是正确的想法和制作所有者实体?

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

      2。我在UserImages 类中没有任何userId,但有Users 类的引用,那么如何根据userId 添加或更新或删除userImages

      由于您在UserImages 中有Users 的引用,因此您可以通过users 本身获得userImagesHibernate 会为你做这件事。如果您仍想通过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();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2018-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-08
        • 1970-01-01
        • 1970-01-01
        • 2010-09-29
        • 1970-01-01
        相关资源
        最近更新 更多