[英]How to define relationship between models in Java and Database?
我有三个模型(即Users,UsersImages,UserLocation)对应于数据库中有三个表。 我将用户作为所有者实体,因为如果用户在那里,那么只有它的图像和它的位置是可能的,因此定义了这种关系。
我有两个疑问:
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
}
谁能帮我消除这个疑问??
谢谢
是的,你的方法是正确的。
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是单向还是双向关系。 它们之间有优点和缺点,并且像往常一样,选择因用途而异。 从我看到的情况来看,您希望在这里有双向的,因此在实体之间提供同步方法(添加和删除)至关重要。
@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
。 在双向映射中删除应该由您的同步删除方法完成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.