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

Posted

技术标签:

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

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

我有两个疑问:

    如果这是正确的想法和制作所有者实体?如果是这样, 我在 UserImages 类中没有任何 userId,但有 Users 类的引用,那么如何根据 userId 添加或更新或删除 userImages。 如果这是错误的,那么在这三个模型之间建立关系的正确方法是什么。
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】:

首先你要决定在ORM层是单向还是双向关系,即hibernate。它们之间有优点和缺点,并且像往常一样,选择因用途而异。据我所知,您希望这里有双向的,因此在实体之间提供同步方法(添加和删除)至关重要。

    就“所有者实体”而言,您必须告诉 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

    如果您的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();
    

【讨论】:

以上是关于如何定义Java中的模型和数据库之间的关系?的主要内容,如果未能解决你的问题,请参考以下文章

雄辩:定义模型和迁移中的关系之间的区别

关系模型和关系运算理论

java面试-Java内存模型(JMM)

Node.js ORM框架Sequlize之表间关系

Java内存模型

7.Django模型类的定义和管理