我是一位经验丰富的.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类型。
感谢您的专业知识和关注
我没有看到任何问题,因为您的实体没有任何可以导航到其他实体的字段(即,没有用@OneToMany
/ @ManyToOne
映射的字段),因此其所有字段都映射到了相同的数据库表,没有理由将导致单独的数据库调用来加载实体。
spring-data-jpa还提供了一个基础实体AbstractAuditable
,开发人员可以选择使用它,而不是自己创建(尽管使用它会增加该实体与Spring Data的耦合),因此将基础实体作为一个单独的实体共享JAR并让其他项目使用非常普遍。如果您的公司有一些规则,所有实体必须具有特定的字段集(例如id,createdBy等),这甚至是一个好习惯,主要是因为它可以使代码如您所说的那样干燥。