Java 聚合根具有多个相同类型的值对象的问题

Java 聚合根具有多个相同类型的值对象的问题,java,postgresql,spring-boot,spring-data,spring-data-jdbc,Java,Postgresql,Spring Boot,Spring Data,Spring Data Jdbc,我不熟悉SpringDataJDBC,并使用SpringBoot2.5.0、Java11和Lombok(代码示例简化)创建了一个包含两个地址值的客户聚合 我有一个客户实体(聚合根)和一个地址值对象 @Data @Builder @AllArgsConstructor class Customer { @Id Long id; String name; Address address1; Address address2; } @Data @Builder @Al

我不熟悉SpringDataJDBC,并使用SpringBoot2.5.0、Java11和Lombok(代码示例简化)创建了一个包含两个地址值的客户聚合

我有一个客户实体(聚合根)和一个地址值对象

@Data
@Builder
@AllArgsConstructor
class Customer {
    @Id Long id;
    String name;
    Address address1;
    Address address2;
}

@Data
@Builder
@AllArgsConstructor
class Address {
    String city;
}
和一个用于客户实体的存储库

@Repository
public interface CustomeRepository extends CrudRepository<Customer, Long> {
}
创建和存储客户

        var address1 = Address.builder().city("New York").build();
        var address2 = Address.builder().city("Chicago").build();
        var customer = Customer.builder().name("Joe").address1(address1).address2(address2).build();
        var result = customerRegistry.save(customer);
到目前为止还不错,数据库中的条目看起来也不错

 id | name 
----+------
  1 | Joe


 id | customer |   city   
----+----------+----------
  1 |        1 | Chicago
  2 |        1 | New York
因此,期待一位客户,但在这样做时

var customers = customerService.findAll();
customers.forEach(c -> log.debug("Customer: {}", c));
输出将是

Customer(id=1, name=Joe, address1=Address(city=New York), address2=Address(city=Chicago))
Customer(id=1, name=Joe, address1=Address(city=Chicago), address2=Address(city=Chicago))
Customer(id=1, name=Joe, address1=Address(city=New York), address2=Address(city=New York))
Customer(id=1, name=Joe, address1=Address(city=Chicago), address2=Address(city=New York))
这么做

var customers = customerService.findAll();
customers.forEach(c -> log.debug("Customer: {}", c));
var customer=customerRepository.getById(result.getId()); 将导致

org.springframework.dao.IncorrectResultSizeDataAccessException:结果大小不正确:预期为1,实际为4
顺便说一句,如果客户只有一个地址字段,则一切正常


那么我是否遗漏了什么或者这是一个bug?

您可以在一个或两个属性上放置一个
@Column
注释,指定不同的列用于
客户的反向引用

例如:

class Customer {
    @Id Long id;
    String name;
    @Column("first")
    Address address1;
    @Column("second")
    Address address2;
}
需要以下
地址

CREATE TABLE "address" (
  "id"                  BIGSERIAL       NOT NULL,
  "first"               BIGINT,
  "second"              BIGINT,
  "city"                VARCHAR(255)    NOT NULL,
  PRIMARY KEY (id)
);

嗨,Jens,非常感谢您的快速回复!实际上,我使用了一个类似于map的map来表示三种不同的地址类型。这很好,但我认为你的建议是更好的解决方案。来自Flensburg、StefanFirst和second的感谢和问候这些列应该在客户表或地址表中?@Gaurav在地址表中,确切地址将存储在哪里,我考虑将第一和第二列作为address@Gaurav对不起,我不明白你的问题。
地址中的
id
是不必要的,我建议不要使用。
first
second
的组合是唯一的。