gpt4 book ai didi

java - 选择继承策略 - Hibernate

转载 作者:行者123 更新时间:2023-12-02 02:55:08 26 4
gpt4 key购买 nike

如果在这里问这个问题,我肯定找不到它,或者它对我没有特别帮助。

我读了一些继承映射的教程和一些问题,但并不能完全解决我的问题。

假设我有一个抽象类:

User

还有 3 个其他子类:

UserA, UserB, UserC

这些都扩展了 User。

每个子类都有自己的表,而父类(super class)User则没有。

在我的另一个类网站中,我有一个ArrayList,或者我应该说用户的集合。

该列表应获取网站的所有用户。

我应该使用哪种策略?我想到了 MappedSuperclass,但由于在我的 Website 类中,List 是 User 类型,所以我不确定在这里做什么。

感谢您的帮助!

最佳答案

使用 JPA,Java 实现始终取决于您自己的偏好和要求,有时这是一个选择的问题。

是的,@MappedSuperclass 就可以了。您可以让每个 child 与网站具有单向关系。然后,您将在 User 类中拥有 Website 对象(带有一堆注释),它将作为foreign_key 字段映射到数据库(假设您正在使用 SQL 存储和来自 JPA 的“Repositories”DAO 抽象)。

没有必要在 Website 类中存储用户集合。想想看,如果你真的需要它——支持一致性可能会变得一团糟。但有些情况下您需要双向关系。当您将对象存储在内存中(例如出于缓存目的)时,您可能需要拥有此集合。在这种情况下,为什么不收集“用户”呢?无论如何,您将通过专用存储库获取数据(或者即使您不使用这些存储库,任何其他方式也将使用带有foreign_key的“用户”表,而不是“网站”表)。

因此,例如,使用 Spring Data JPA,您可以在父类(super class)中定义单向关系并使用“存储库”(您可以在互联网上的任何地方找到双向示例,因此我不提供它):

@Entity
public class SuperUser extends User {
...
}

@Entity
public class BasicUser extends User {
...
}

@MappedSuperclass
public abstract class User implements Serializable {

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "website_uuid", nullable = false)
protected Website website;

...
}

@Entity
public class Website implements Serializable {

...
}


@Repository
public interface SuperUserRepository extends CrudRepository<SuperUser, Long> {

Iterable<SuperUser> findByWebsite(Website website);

}

@Repository
public interface BasicUserRepository extends CrudRepository<BasicUser, Long> {

Iterable<BasicUser> findByWebsite(Website website);

}

关于java - 选择继承策略 - Hibernate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43219822/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com