在共享库中为JPA实体(域类型对象)创建基类的缺点

问题描述 投票:0回答:1

我是一位经验丰富的.net开发人员,最近转向Java开发。我正在使用Spring Boot / Cloud进行微服务。对于我的工作,我创建了一个通用jar(共享库),在其中放置了可在不同微服务之间重用的那些功能和辅助方法。

我通过在每个Spring Boot微服务应用程序中添加共享库的pom文件来调用共享库。这一切都很好,我可以按预期在每个微服务中使用共享库。

现在。我正在使用JPA保存数据,因此每个微服务应用程序都需要有一个实体类,该实体类使用代码优先的方式在各自的数据存储中创建持久性。

由于大多数微服务中所需的公共字段很少,所以我想到了在我的公共jar(共享库)中创建基础Entity类,并使我的微服务中的实体继承基础Entity类的想法。

这是我在共享库中创建的基础Entity类

package com.microservice.xcloud.common.entity;

import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;

@MappedSuperclass
public class BaseEntity {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    Long id;

    ...

    @Column(nullable = true , name = "isDeleted")
    private boolean isDeleted;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
    ...

    public boolean isDeleted() {
        return isDeleted;
    }

    public void setDeleted(boolean isDeleted) {
        this.isDeleted = isDeleted;
    }   

}

现在在我的不同微服务中,我从此类继承来,以便拥有这些字段而不必一次又一次地写它们。(DRY原则)。

我在与.net和EF一起使用时也使用了这种方法,发现它运行良好。我会将基本实体放置在共享的dll中,并在我的应用程序中从其继承。因此,尽管我为Java使用了相同的东西,但我在微服务应用程序的Entity类中做到了这一点。

package com.microservice.xcloud.companyservice.entity;



import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;

import com.microservice.xcloud.common.entity.BaseEntity;

@Entity
@Table(name = "companymaster")
public class CompanyMaster extends BaseEntity{



    @Column(nullable = false , name = "companyName")
    private String companyName;

    @Column(nullable = true , name = "description")
    private String description;



    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public CompanyMaster() {
        super();

    }
}

请注意,我有两个不同的应用程序,1.共享Java库,称为common2.通过pom使用共享库,称为公司服务的微服务应用程序

<!-- Shared library -->
<dependency>
    <groupId>com.microservice.xcloud</groupId>
    <artifactId>common</artifactId>
    <version>${project.version}</version>
</dependency>

有人告诉我这是一个糟糕的体系结构,不应以这种方式完成。我还被告知,这将导致对db的两个单独调用,一个用于共享库的基本实体,另一个用于微服务的实体类。这是我在.net世界中从未听说过的东西。由于我是Java新手,因此需要您的专家建议。据我所知,在.net世界中,由于共享库是dll,并且不能单独运行并且需要附加到应用程序,所以这完全没有问题。我的共享库(使用spring boot创建)没有主要方法,因此应附加到调用微服务,例如将dll类型的jar附加到jar的exe类型。

感谢您的专业知识和关注

java spring-boot jpa design-patterns dry
1个回答
0
投票

我没有看到任何问题,因为您的实体没有任何可以导航到其他实体的字段(即,没有用@OneToMany / @ManyToOne映射的字段),因此其所有字段都映射到了相同的数据库表,没有理由将导致单独的数据库调用来加载实体。

还提供了一个基础实体AbstractAuditable,开发人员可以选择使用它,而不是自己创建(尽管使用它会增加该实体与Spring Data的耦合),因此将基础实体作为一个单独的实体共享JAR并让其他项目使用非常普遍。如果您的公司有一些规则,所有实体必须具有特定的字段集(例如id,createdBy等),这甚至是一个好习惯,主要是因为它可以使代码如您所说的那样干燥。

© www.soinside.com 2019 - 2024. All rights reserved.