如何定义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 谁是关系的所有者,即谁拥有对外键的引用。您可以使用
@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
。在双向映射中,删除应由您的同步删除方法完成。
【讨论】:
【参考方案2】:1。如果这是正确的想法和制作所有者实体?
是的,你的方法是正确的。
2。我在UserImages
类中没有任何userId
,但有Users
类的引用,那么如何根据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();
【讨论】:
以上是关于如何定义Java中的模型和数据库之间的关系?的主要内容,如果未能解决你的问题,请参考以下文章