API output Wert, statt ID

OnDemand

Top Contributor
Hallo zusammen,

ich bin mir nicht sicher, ob mein folgender Output so logisch ist.
Ich möchte eigentlich, dass statt der ID der entsprechende Wert aus der Datenbanktabelle ausgegeben wird. Die ID sind jeweils in einer eigenen Tabelle abgespeichert.
Ist das so sinnvoll? Ein konsumierender Service müsste ja dann eine Resource für manufacturer erstmal lesen um zu wissen, welcher Herstellername hinter der ID 1 steckt. Geht das nicht irgendwie etwas einfacher? (SpringBoot nutz ich)
upload_2018-6-12_17-25-25.png
 

OnDemand

Top Contributor
Manufacturer so zb

Java:
/**
* The persistent class for the manufacturer database table.
*
*/
@Entity
@Table(name="manufacturer")
@NamedQuery(name="Manufacturer.findAll", query="SELECT m FROM Manufacturer m")
public class Manufacturer implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="manufacturer_id")
    private int manufacturerId;

    @Column(name="manufacturer_name")
    private String manufacturerName;

    public Manufacturer() {
    }

    public int getManufacturerId() {
        return this.manufacturerId;
    }

    public void setManufacturerId(int manufacturerId) {
        this.manufacturerId = manufacturerId;
    }

    public String getManufacturerName() {
        return this.manufacturerName;
    }

    public void setManufacturerName(String manufacturerName) {
        this.manufacturerName = manufacturerName;
    }

}

Wie könnte ich das dann einbetten? ein Objekt rein?
 

mrBrown

Super-Moderator
Mitarbeiter
Wenn du Spring Boot nutzt, nutzt du doch sicher Spring Data JPA?
Auf die NamedQuery kannst du da im wesentlichen verzichten, das wird alles deutlich bequemer über Repositorys abgedeckt.


Interessanter als diese Klasse, wäre die, die Manufacturer enthält ;)
Dann könnte man da mehr zu sagen
 

OnDemand

Top Contributor
Da wo Manufacturer drin steckt ist folgende:

Java:
@NamedQuery(name = "Product.findAll", query = "SELECT p FROM Product p")
public class Product implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "products_id")
    private int productsId;

    @Column(name = "manufacturer_id")
    private int manufacturerId;

    @Column(name = "products_rating")
    private BigDecimal productsRating;

    @Column(name = "products_sku")
    private String productsSku;

    // bi-directional many-to-one association to ProductsAttribute
    @OneToMany(mappedBy = "product")
    private List<ProductsAttribute> productsAttributes;

    // bi-directional many-to-one association to ProductsCode
    @OneToMany(mappedBy = "product")
    private List<ProductsCode> productsCodes;

    // bi-directional one-to-one association to ProductsDescription
    @OneToOne(mappedBy = "product")
    private ProductsDescription productsDescription;

    // bi-directional many-to-one association to ProductsToCategory
    @OneToMany(mappedBy = "product")
    private List<ProductsToCategory> productsToCategories;

    public Product() {
    }

    public int getProductsId() {
        return this.productsId;
    }

    public void setProductsId(int productsId) {
        this.productsId = productsId;
    }

    public int getManufacturerId() {
        return this.manufacturerId;
    }

    public void setManufacturerId(int manufacturerId) {
        this.manufacturerId = manufacturerId;
    }

    public BigDecimal getProductsRating() {
        return this.productsRating;
    }

    public void setProductsRating(BigDecimal productsRating) {
        this.productsRating = productsRating;
    }

    public String getProductsSku() {
        return this.productsSku;
    }

    public void setProductsSku(String productsSku) {
        this.productsSku = productsSku;
    }

    public List<ProductsAttribute> getProductsAttributes() {
        return this.productsAttributes;
    }

    public void setProductsAttributes(List<ProductsAttribute> productsAttributes) {
        this.productsAttributes = productsAttributes;
    }

    public ProductsAttribute addProductsAttribute(ProductsAttribute productsAttribute) {
        getProductsAttributes().add(productsAttribute);
        productsAttribute.setProduct(this);

        return productsAttribute;
    }

    public ProductsAttribute removeProductsAttribute(ProductsAttribute productsAttribute) {
        getProductsAttributes().remove(productsAttribute);
        productsAttribute.setProduct(null);

        return productsAttribute;
    }

    public List<ProductsCode> getProductsCodes() {
        return this.productsCodes;
    }

    public void setProductsCodes(List<ProductsCode> productsCodes) {
        this.productsCodes = productsCodes;
    }

    public ProductsCode addProductsCode(ProductsCode productsCode) {
        getProductsCodes().add(productsCode);
        productsCode.setProduct(this);

        return productsCode;
    }

    public ProductsCode removeProductsCode(ProductsCode productsCode) {
        getProductsCodes().remove(productsCode);
        productsCode.setProduct(null);

        return productsCode;
    }

    public ProductsDescription getProductsDescription() {
        return this.productsDescription;
    }

    public void setProductsDescription(ProductsDescription productsDescription) {
        this.productsDescription = productsDescription;
    }

    public List<ProductsToCategory> getProductsToCategories() {
        return this.productsToCategories;
    }

    public void setProductsToCategories(List<ProductsToCategory> productsToCategories) {
        this.productsToCategories = productsToCategories;
    }

    public ProductsToCategory addProductsToCategory(ProductsToCategory productsToCategory) {
        getProductsToCategories().add(productsToCategory);
        productsToCategory.setProduct(this);

        return productsToCategory;
    }

    public ProductsToCategory removeProductsToCategory(ProductsToCategory productsToCategory) {
        getProductsToCategories().remove(productsToCategory);
        productsToCategory.setProduct(null);

        return productsToCategory;
    }}
 

mrBrown

Super-Moderator
Mitarbeiter
Naja, dein Objekt hat ja nur einen einfachen int:
Java:
 @Column(name = "manufacturer_id")
private int manufacturerId;

Da steckt nicht drin, dass das ein Fremdschlüssel ist ;)

Du solltest die Entitys als ganz normale Objekte designen, mit ganz normalen Beziehung zu anderen Objekten (also direkt private Manufacturer manufacturer statt der ID), das ganze passend für die Datenbank abzubilden übernimmt dann JPA.
 

OnDemand

Top Contributor
Vielen Dank,

@Column(name = "manufacturer_id")
private Manufacturer manufacturer;

sagt mir Eclipse :
Join column "manufacturer_manufacturer_id" cannot be resolved on table "products"

Was muss ich denn dann annontieren?
 

mrBrown

Super-Moderator
Mitarbeiter
sagt mir Eclipse :
Eclipse halt ¯\_(ツ)_/¯

Was muss ich denn dann annontieren?
So wie die anderen Relationen auch, mit OneToMany, ManyToOne, etc...

In dem Fall ManyToOne (und u.U. noch weitere, da hilf ein Blick in irgendein passendes JPA-Tut, da gibt eine Menge an Möglichkeiten).

(ich würde aber auch die eigene ID immer nur id nennen, zu welchem Objekt die gehört ist ja klar, und dann kommt da nicht sowas wie manufacturer_manufacturer_id bei raus. UU kann man die ID dann auch in eine Basis-Klasse ziehen.)
 

OnDemand

Top Contributor
Dann brauch ich aber in der manufacturer Tabelle eine Referenz auf Product oder?
Manufacturer ist aber nicht abhängig von Product
 

OnDemand

Top Contributor
Hab ich auch grad bemerkt :D

Hm komisch, jetzt hat mir Hibernate eine Spalte manufacturer_manufacturer_id in products angelegt.
1. warum?
2. wir kann ich das vermeiden, dass es eigenständig die Datenbank verändert?
 

mrBrown

Super-Moderator
Mitarbeiter
Hm komisch, jetzt hat mir Hibernate eine Spalte manufacturer_manufacturer_id in products angelegt.
1. warum?

Vorher wird es in Product doch auf eine Spalte gegeben haben, die auf Manufacturer verweist?

Die Default-Benennung für Verweise auf andere Tabellen ist <Feldname>_<Name des ID-Felds>, erstes ist hier "manufacturer", und die ID von Manufacturer ist "manufacturer_id", ergibt eben "manufacturer_manufacturer_id"

2. wir kann ich das vermeiden, dass es eigenständig die Datenbank verändert?
In deinen Properties kannst du spring.jpa.hibernate.ddl-auto angeben, aktuell dürfte das auf update stehen (bedeutet, das Schema wird angepasst), du kannst das auf validate setzen, dann wird nur noch überprüft, ob Klassen und Schema zueinander passen. (spring.jpa.hibernate.ddl-auto=validate, wenn properties, mit yaml entsprechend mit dessen Syntax)
 

OnDemand

Top Contributor
o_O krasser typ! danke!!
so nun nochmal zu der Doppel id. hab in product eine manufacture_id und in der product_id folgenden Code
Java:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "products_id")
private int productsId;

@Column(name = "manufacturer_id")
private int manufacturerId;

@ManyToOne
private Manufacturer manufacturer;

wie muss die denn dann korrekt lauten?
 

mrBrown

Super-Moderator
Mitarbeiter
wie muss die denn dann korrekt lauten?
Die objekt-eigene ID kann so blieben, das bleibt völlig dir überlassen. Üblicher wäre aber einfach id für die eigene ID (also in diesem Fall statt productsId). Alle anderen IDs würde man über Beziehungen abbilden (manufacturerId ist in diesem Fall ja schon durch manufacturer ersetzt)

Würde also zu:
Java:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")//uU anpassen
private int id;

@ManyToOne
private Manufacturer manufacturer;
 
Zuletzt bearbeitet:

OnDemand

Top Contributor
Super! Vielen Dank du hast mir wie immer super weitergeholfen!

Mein Json sieht nun wie folgt aus, irgendwas zu meckern was man verbessern könnte?

Code:
{
    "id": 1,
    "manufacturer": {
        "manufacturerName": "Tonrtezilla"
    },
    "productsRating": 6,
    "productsSku": "12345",
    "productsAttributes": [
        {
            "productsAttributesDescription": {
                "languageId": 1,
                "productsAttributeName": "Größe"
            },
            "productsAttributesValue": {
                "productsAttributeValue": "XXL",
                "language_id": 1
            }
        }
    ],
    "productsCodes": [
        {
            "productsEan": "zzz",
            "productsMpn": "uuuu"
        }
    ],
    "productsDescription": {
        "languageId": 1,
        "productsDescription": "lange beschreibung",
        "productsName": "testname",
        "productsSeoDescription": "seo beschreibung",
        "productsSeoKeywords": "",
        "productsSeoTitle": "",
        "productsShortDescription": "kurze beschreibung"
    },
    "productsToCategories": [
        {
            "productsCategoriesId": 1
        },
        {
            "productsCategoriesId": 2
        }
    ]
}

Die Kategorien werden der nächste Knaller -.-
Ein Product kann in mehreren Kategorien sein, wobei jede Kategorie unterschiedlich viele Eltern und Kinder haben kann
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H File Output Servlet Web Tier 6
S HTML Output verschleiern Web Tier 6
ruutaiokwu myfaces macht unbekannte zeichen in output rein... Web Tier 7
H Richfaces - Taglib Problem gelb unterstrichen Ajax Output Web Tier 6
A Dojo: Tab deaktivieren wenn in einem Listenfeld ein bestimmter Wert steht Web Tier 3
F JSF h:selectOneMenu Wert vorbelegen klappt nicht? Web Tier 2
G JSF Radio Button ValueChangeListener Wert wird nicht übernommen Web Tier 2
T Checkbox einbauen und wert in DB übertragen Web Tier 16
D JSF <rich:select, "Überprüfungsfehler: Wert ist ungültig" Web Tier 10
H JSF ActionListener wird ausgeführt, aber ändert den Wert nicht. Web Tier 7
T Seam-Projekt Eingabefeld mit "null"-Wert Web Tier 7
M SelectoneMenu Default Wert Web Tier 4
J JSF: Initialisieren einer Property mit Wert? Web Tier 5
D JSF: locale verliert Wert nach Navigation Web Tier 6
ruutaiokwu Wert hinter JSP-Tag nach Java-String in Skriptlet Web Tier 4
E Wert aus JSF-Selectonemenu in Textfeld schreiben Web Tier 4
G wert für hiddenfield per javascript setzten Web Tier 4
x22 Autocomplete statt Drop Down Web Tier 3
xehpuk JSF 404 statt 500 bei nicht existenter JSF-Seite Web Tier 7
D "meineseite.de/user" statt "meineseite.de/index.jsp?site=user" Web Tier 2
R GWT 2.1.1 mit Java 1.6 statt 1.5 Web Tier 8
G JSF: .xhtml statt .jsf? Web Tier 2

Ähnliche Java Themen

Neue Themen


Oben