카테고리 없음

모두 함께 연결된 OneToOne 및 OneToMany를 만드는 방법

기록만이살길 2021. 2. 26. 06:21
반응형

모두 함께 연결된 OneToOne 및 OneToMany를 만드는 방법

1. 질문(문제점):

나는 프론트 엔드에서 왔기 때문에이 모든 것이 나에게 새로운 것입니다. 다음 엔터티가 Client있으며 Cart, Product이러한 엔터티는 다음과 같이 연결되어 있습니다.

  1. Client<=> @OneToOne<=>Cart
  2. Cart=> @OneToMany=> Product( @ManyToOneCart)

my SpringDataJpaApplication실행 하면 Postgres의 모든 열과 외래 키가있는 3 개의 테이블이 모두 올바르게 생성됩니다. 새로운 만들기 Cart모든 필드와 함께, 모두 만들어집니다 ClientCartPostgres의의를하지만, 작성하지 않습니다 Product이다 @ManyToOne. 데이터베이스를 쿼리하면 다음에 대한 빈 필드가 생성됩니다.Product

// Client
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Entity
public class Client {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int client_id;

private String name;
private String lastName;

@OneToOne(mappedBy = "client")
private Cart cart;
}


// Cart
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Entity
public class Cart {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int cart_id;

@OneToMany(mappedBy = "cart")
private List<Product> productList;


@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "fk_client_id", referencedColumnName = "client_id")
    private Client client;
}


//Product
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Entity
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int product_id;
    private String productName;
    private int price;
    private int qty;

    @ManyToOne
    @JoinColumn(name = "fk_cart_id")
    private Cart cart;
}


// CartController
@RestController
    public class CartController {

        @Autowired
        CartRepository cartRepository;

        @PostMapping("/createCart")
        public Cart createCart(@RequestBody Cart request) {
            return cartRepository.save(request);
        }
}

언급했듯이 엔드 포인트에 게시하면 및에 200대해서만 생성 된 with 레코드 (위에서 언급 한대로)가 반환 됩니다 . 게시 요청은 다음과 같습니다.ClientCart

{
  "productList": [
    {
      "productName": "mobile",
      "price": 800,
      "qty": 2
    }
  ],
  "client": {
    "name": "John",
    "lastName": "Done"
  }
}

내가 무엇을 잘못하고 있지? Product테이블이 채워 지지 않는 이유는 무엇 입니까? ( 참고 : 단지와 @OneToMany@ManyToOneCartProduct나는 둘 다 채울 수 있어요,하지만이 때 Client믹스에 던져되고, 내가 문제가 위의 describbed이)

2. 해결방안:

엔티티 소유의 개념은 당신이 놓친 것입니다.

에서 Cart엔티티, 당신은 :

@OneToMany(mappedBy = "cart")
private List<Product> productList;

이것은 Product엔티티가 관계를 소유하고 있음을 나타냅니다. 관계를 소유 한 엔터티 만 관계를 유지할 수 있습니다. 이것은 a Product가 지속될 수 Cart있지만 비자의 경우는 불가능 함을 의미합니다 . 요컨대, 당신은 Product자신 을 지속해야합니다 . 따라서 카트를 저장 한 다음 제품에 카트를 설정하고 제품을 저장하십시오.

당신이 그것을 가지고 있지 않았다면 @ManyToOne그 자체로 동일한 행동 방침을 지시합니다.

@ManyToOne
@JoinColumn(name = "fk_cart_id")
private Cart cart;

productList쿼리 전용 필드로 고려되어야한다.

Cascade주석이있는 게임을 할 수 Cart있지만 권장하지 않습니다. 다소 복잡하고 성가신 주석입니다. 대신있는의 Repository당신에 Controller층, 생성 @Service층과 지속 넣어, 검색 및 기타 비즈니스 로직이은과 컨트롤러에서이 포함되어 있습니다. 표준 패턴.

그런 다음 서비스 계층에 대한 junit / mockito 테스트 케이스를 작성하십시오.

편집 : 명확하게하기 위해 Product는를 유지할 수 없지만 카트 필드에 설정하려면 Cart이전에 유지해야 Cart합니다. Cart엔티티에 대한 그러한 요구 사항이 없습니다 .

65782045
반응형