Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何定义Java中的模型和数据库之间的关系?_Java_Database_Spring Boot_Hibernate_Spring Data Jpa - Fatal编程技术网

如何定义Java中的模型和数据库之间的关系?

如何定义Java中的模型和数据库之间的关系?,java,database,spring-boot,hibernate,spring-data-jpa,Java,Database,Spring Boot,Hibernate,Spring Data Jpa,我有三个模型(即Users、UsersImages、UserLocation),数据库中有三个对应的表。我将用户作为所有者实体,因为如果用户在那里,那么只有其图像和位置是可能的,因此定义了这种关系 我有两个疑问: 如果这是正确的想法,并使业主实体?如果是, 我在类UserImages中没有任何userId,但是有Users类的引用,因此如何基于userId添加、更新或删除UserImages 如果这是错误的,那么建立这三个模型之间关系的正确方法是什么 谁能帮我澄清这个疑问 谢谢。如果这是正确的想

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

我有两个疑问:

  • 如果这是正确的想法,并使业主实体?如果是,
  • 我在类UserImages中没有任何userId,但是有Users类的引用,因此如何基于userId添加、更新或删除UserImages
  • 如果这是错误的,那么建立这三个模型之间关系的正确方法是什么
  • 谁能帮我澄清这个疑问

    谢谢。如果这是正确的想法,并使业主实体? 是的,你的方法是正确的

    2.我在类
    UserImages
    中没有任何
    userId
    ,但是有
    Users
    类的引用,那么如何基于
    userId
    添加、更新或删除
    UserImages
    由于您在
    UserImages
    中有
    Users
    的引用,因此可以通过
    Users
    本身获得
    UserImages
    <代码>休眠将为您执行此操作。如果您仍然希望通过
    userId
    获取
    userImages
    ,也可以通过
    users.getId()
    -获取
    userId

    Spring数据
    将自动为您提供这些方法-

    public interface UserImagesRepository extends CrudRepository<UserImages, Long> {
      UserImages findById(long id);
    }
    
    1.如果这是正确的想法,并使业主实体? 是的,你的方法是正确的

    2.我在类
    UserImages
    中没有任何
    userId
    ,但是有
    Users
    类的引用,那么如何基于
    userId
    添加、更新或删除
    UserImages
    由于您在
    UserImages
    中有
    Users
    的引用,因此可以通过
    Users
    本身获得
    UserImages
    <代码>休眠将为您执行此操作。如果您仍然希望通过
    userId
    获取
    userImages
    ,也可以通过
    users.getId()
    -获取
    userId

    Spring数据
    将自动为您提供这些方法-

    public interface UserImagesRepository extends CrudRepository<UserImages, Long> {
      UserImages findById(long id);
    }
    

    首先,您必须决定在ORM层(即hibernate)中使用单向关系还是双向关系。它们之间既有优点也有缺点,而且像往常一样,在不同的用法中,选择也不尽相同。据我所知,您希望这里有一个双向的,所以在实体之间提供同步方法(添加和删除)是至关重要的

  • 就“所有者实体”而言,您必须告诉hibernate谁是关系的所有者,即谁引用了外键。您可以使用
    @JoinColumn
    mappedBy
    执行此操作,这两种方法都可以使用
  • 如果您的
    Users
    实体是持久的,那么当您从
    userImagesList
    中删除一些图像时,它将与数据库同步。当负责从列表中删除该图像的方法完成时(或当您使用
    entityManager.flush()
    ),该图像将从数据库中删除,因为
    CascadeType
    。在双向映射中,应该通过同步删除方法来删除

  • 首先,您必须决定在ORM层(即hibernate)中使用单向关系还是双向关系。它们之间既有优点也有缺点,而且像往常一样,在不同的用法中,选择也不尽相同。据我所知,您希望这里有一个双向的,所以在实体之间提供同步方法(添加和删除)是至关重要的

  • 就“所有者实体”而言,您必须告诉hibernate谁是关系的所有者,即谁引用了外键。您可以使用
    @JoinColumn
    mappedBy
    执行此操作,这两种方法都可以使用
  • 如果您的
    Users
    实体是持久的,那么当您从
    userImagesList
    中删除一些图像时,它将与数据库同步。当负责从列表中删除该图像的方法完成时(或当您使用
    entityManager.flush()
    ),该图像将从数据库中删除,因为
    CascadeType
    。在双向映射中,应该通过同步删除方法来删除
  • class UserLocation{
      
      long id;
    
      @OneToOne(mappedBy="userlocation")
      Users usersObj;
    
      // some other data members
    
      // getters and setters
    }
    
    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();
        }
    }
    
    @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
    }