Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.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_Hibernate_Oop_Design Patterns - Fatal编程技术网

Java 与多个实体关联的实体

Java 与多个实体关联的实体,java,hibernate,oop,design-patterns,Java,Hibernate,Oop,Design Patterns,我有多个这样的实体: Public class User{ int age; . . . @OneToMany private Set<Comment> comments = new HashSet<>(); } 公共类用户{ 智力年龄; . . . @独身癖 private Set comments=new HashSet(); } 及 公共类产品{ 字符串名; . . . @独身癖 private Set comme

我有多个这样的实体:

Public class User{
    int age;
    .
    .
    .
    @OneToMany
    private Set<Comment> comments = new HashSet<>();
}
公共类用户{
智力年龄;
.
.
.
@独身癖
private Set comments=new HashSet();
}

公共类产品{
字符串名;
.
.
.
@独身癖
private Set comments=new HashSet();
}
还有更多。如您所见,注释可能与用户、产品等相关。我怎么能有一个注释类来做这样的事情呢

解决方案:

  • 我可以为每个实体提供多个注释类,例如UserComment、ProductComment等等,但我相信有更好的方法可以做到这一点
  • 我可以创建一个可注释类,如下所示:

    Public class Commentable{
        private Set<Comment> comments = new HashSet<>();
    }
    
    公共类可注释{
    private Set comments=new HashSet();
    }
    
  • 然后让用户、产品等扩展它,但这将是一个问题,因为我有多个类似于评论的类,例如评级,那么我将有一个可评级的类,…等等

    我确信我缺少一种设计模式或面向对象编程概念


    非常感谢

    您可以拥有一个
    评论
    类,只要它是单向的,并且拥有方(负责关系的人)是
    用户
    Product
    等。这要求您拥有像
    UserComment
    ProductComment
    这样的映射表,并向
    注释集添加一些内容

    如果注释很简单,它们也可以被嵌入,直接存储在映射表中

    如果您不想使用任何映射表,并且希望使用JPA方式,那么您可以使用解决方案选项1,将
    Comment
    作为
    UserComment
    等的基类。然后,您可以使用单个表继承策略,并为“容器”(用户、产品等)ID添加/重用列

    这样做的一个缺点是,每个容器可能会有一个额外的列,或者如果重用列(即,该值的含义取决于鉴别器),则容器实体需要具有类型兼容的ID(例如,所有整数或字符串),并且可能无法使用外键约束(除非您的数据库支持“部分”外键约束,我知道没有数据库支持)

    Public class Commentable{
        private Set<Comment> comments = new HashSet<>();
    }