有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用六边形体系结构将域对象映射到Jpa实体

在阅读了关于六边形体系结构的文章之后,我决定实现这些实践。我只想知道如何将域对象映射到域实体。这是我试过的

//jpa实体

@Entity
@Data
public class Worker {
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;
    private String phoneNumber;
    private String firstName;
    private String lastName;
    private String workerType;
    private String ifu;
    private String workerPicture;
    private String statut;
    
     @OneToMany(mappedBy = "worker")
      Set<CategoryWorker> category;
}

//域模型

public class Worker {
    private Long id;
    private String phoneNumber;
    private String firstName;
    private String lastName;
    private String workerType;
    private String ifu;
    private String imageParth;
    private String statut;
    }

//输出

public interface ListOfWorkerRepository {
    public List<Worker> findAll();
}

//输入端口

public interface ListOfWorker {
    public List<Worker> findAll();
}

//适配器输出

public class ListWorkerImpl implements ListOfWorkerRepository{
    WorkerJpaInterface workerJpaInterface;
    @Override
    
    public List<Worker> findAll() {
        
        return  workerJpaInterface.findAll();
    }

}
// here I have an conversion error 


共 (2) 个答案

  1. # 1 楼答案

    我猜这是因为这两个班都叫“工人”。如果你将其重命名为“WorkerJpa”和“WorkerDomain”,你会发现问题所在。 我说‘我猜’是因为我们看不到堆栈跟踪和包结构有助于分析。 你需要一种WorkerMapper(比如实体到数据到映射器、java类或使用MapStruct等)。通常它应该在WorkerJpa包中,因为我们假设外部工作者类结构可以更改,并且应该由映射器调整到域实体

  2. # 2 楼答案

    这里:

    public List<Worker> findAll() {
        return  workerJpaInterface.findAll();
    }
    

    正如crush84正确指出的那样,它们是不同的类,因此会出现转换错误。我认为你需要通过jpa Worker为每一个创建一个新的域模型Worker

    public List<Worker> findAll() {
        List<Worker> jpaWorkers = workerJpaInterface.findAll(); 
        List<Worker> domWorkers = new ArrayList<>();
        // your IDE should scream at you here about different Worker classes
        // so you would have to specify explicitly which worker you're talking about
        for(Worker jpaWorker : jpaWorkers) {
            Worker domWorker = new Worker();
            domWorker.setPhoneNumber(jpaWorker.getPhoneNumber());
            domWorker.setName(jpaWorker.getName());
            //set all the properties of domain model worker 
            //using values from jpa worker
    }
    

    在导入和使用Worker时要非常小心,不要混淆它们。也许你可以将它们重命名为更具描述性的名称,以避免将来出现混淆?我希望这有帮助:D