Професионална програма
Loading...
+ Нов въпрос
kirilstoyanov avatar kirilstoyanov 0 Точки

Spring Boot JPA Релация

Здравейте! От няколко дни се мъча върху ралация в Spring Boot microservice. Таблица products, която има следните полета: name, quantity (броят на продукта наличен в склада), booked, ordered, price. Проблемът е че някои продукти имат подпродукти (не са категории), тоест един продукт (продукт А) има подпродукти (продукт B и C), които са необходими за сглобяването на продукт А. Според мен таблиците би трябвало да изглеждат по следния начин:

Database Schema

Пробвах хиляди неща от интернет примери, клипове, форуми, но никъде няма съчетание между self-relation и m:m релация с допълнителни полета. Имам някакъв написан код за релацията, но тъй като не работи не мисля, че е нужно да го споделям. А това е Product entity:

 

package ee.profitelgid.book.entities;

import com.fasterxml.jackson.annotation.JsonProperty;
import org.springframework.data.rest.core.annotation.RestResource;
import org.springframework.jmx.export.annotation.ManagedNotification;
import org.springframework.security.access.method.P;

import javax.persistence.*;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Currency;
import java.util.HashSet;
import java.util.Set;

@Entity
@Table(name = "products")
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    private String sku;
    private String name;
    private BigDecimal price;

    @JsonProperty("special_price")
    @Column(name = "special_price")
    private BigDecimal specialPrice;

    private BigInteger quantity;
    private BigInteger booked;
    private BigInteger ordered;

    // constructors, setters and getters
}

В това entity мисля че трябва да има Set от продукти (или допълнително entity, което да се явява релацията между продукти и подпродукти) . Какъв е начинът за постигане на желания резултат? Какви annotations да използвам на полетата, които са ключове за релацията? Благодаря предварително!

Тагове:
0
Java Web Services - Spring 25/07/2017 23:34:57
Azsymbobby avatar Azsymbobby 1 Точки

Не е невъзможно да се направи

0
Ivanov.Ivan avatar Ivanov.Ivan Trainer 558 Точки

Привет!

Аз по скоро го виждам като ManyToMany ... ако правилно съм разбрал, продукт А може да се състои от Продукт Б и продукт В. В същото време продукт В може да се състои от продукт Г и продукт Д. Но в крайна сметка са все продукти. Това може да го реализираш с две колекции от същото ентити, в случая Product с релация по между им. 

Пример

Със същия успех можеш да създадеш и OneToMany, като замениш едната колекция с единиче обект.

0
26/07/2017 11:39:40
kirilstoyanov avatar kirilstoyanov 0 Точки

Здравей!

Първо благодаря за отговора! Подобна релация е възможно и точно с това започнах.. Явно не си забелязал, че на снимката с релацията има допълнителни 2 полета (quantity и price). Извиняам се, че не написах че това е по-важното за релацията. Разреших проблема - допълнително Entity, което съдържа quantity, price, parent (продукт), child (продукт) и двете полета (parent и child) са ManyToOne, а респективно полетата от Product Entity-то са OneToMany към допълнителното Entity. Двете изисквания за създаване на подобна релация са допълнителното Entity да има EmbeddedId и релациите от него JoinColumn-а да има следните props: insertable = false, updatable = false.

Забелязах, че всичките анотации си ги сложил на методите. Това ли е по-добрата практика от поставянето им на полетата?

0