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
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.