JPA-Entität ohne ID

Lesezeit: 4 Minuten

JPA Entitat ohne ID
Michail

Ich habe eine Datenbank mit folgender Struktur:

CREATE TABLE entity (
    id SERIAL,
    name VARCHAR(255),
    PRIMARY KEY (id)
);

CREATE TABLE entity_property (
    entity_id SERIAL,
    name VARCHAR(255),
    value TEXT
);

Wenn ich versuche, eine EntityProperty-Klasse zu erstellen

@Entity
@Table(name="entity_property")
public class EntityProperty {

    private String name;
    private String value;

    @Column(name="name")
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    @Column(name="value", nullable=true, length=255)
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
}

Ich bekomme folgende Ausnahme:

org.hibernate.AnnotationException: No identifier specified for entity: package.EntityProperty

Ich weiß, dass JPA-Entitäten einen Primärschlüssel haben müssen, aber ich kann das Datenbankschema aus Gründen, die außerhalb meiner Kontrolle liegen, nicht ändern. Ist es möglich, JPA-Entitäten (Hibernate) zu erstellen, die mit einem solchen Datenbankschema funktionieren?

1647093427 638 JPA Entitat ohne ID
axtavt

Ich schätze deine entity_property hat einen zusammengesetzten Schlüssel (entity_id, name) wo entity_id ist ein Fremdschlüssel zu entity. Wenn ja, können Sie es wie folgt zuordnen:

@Embeddable
public class EntityPropertyPK {
    @Column(name = "name")
    private String name;

    @ManyToOne
    @JoinColumn(name = "entity_id")
    private Entity entity;

    ...
}

@Entity 
@Table(name="entity_property") 
public class EntityProperty { 
    @EmbeddedId
    private EntityPropertyPK id;

    @Column(name = "value")
    private String value; 

    ...
}

  • Danke. Aber wie kann ich in diesem Fall direkt auf die Eigenschaft “Name” der Entität zugreifen? Meine JP-QL-Abfrage funktioniert nur gut, wenn der Zugriff auf “name” über “entity.id.name” erfolgt, aber ich denke, dass es nicht richtig ist.

    – Michail

    30. September 2010 um 6:23 Uhr

  • @mikhail: Wenn Sie es nicht mögen, nähern Sie sich mit @EmbeddedIdkönnen Sie einen alternativen Ansatz mit versuchen @IdClass: docs.jboss.org/hibernate/stable/annotations/reference/en/…

    – axtavt

    30. September 2010 um 9:10 Uhr

  • Sollte die Anmerkung für EntityPropertyPK sein @Embeddedable anstatt @Embedded?

    – Binary_assemble

    9. Juni 2015 um 2:56 Uhr


  • Ja die Anmerkung für EntityPropertyPK muß sein @Embeddable als @Embedded kann nur auf Felder und Methoden angewendet werden. Außerdem Klasse EntityPropertyPK muss deklariert werden Serializable.

    – Dominik

    18. Oktober 2016 um 21:58 Uhr

  • @mikhail: Könnten Sie mir bitte Ihre Zuordnung in der Datei entity.java zeigen?

    – Saravanan

    1. November 2018 um 6:30 Uhr

Ich weiß, dass JPA-Entitäten einen Primärschlüssel haben müssen, aber ich kann die Datenbankstruktur aus Gründen, die außerhalb meiner Kontrolle liegen, nicht ändern.

Genauer gesagt muss eine JPA-Entität welche haben Id definiert. Aber ein JPA Id muss nicht unbedingt auf den Primärschlüssel der Tabelle abgebildet werden (und JPA kann irgendwie mit einer Tabelle ohne Primärschlüssel oder eindeutige Einschränkung umgehen).

Ist es möglich, JPA-Entitäten (Hibernate) zu erstellen, die mit einer solchen Datenbankstruktur funktionieren?

Wenn Sie eine Spalte oder eine Reihe von Spalten in der Tabelle haben, die einen eindeutigen Wert ergeben, können Sie diese eindeutige Gruppe von Spalten als Ihre verwenden Id im JPA.

Wenn Ihre Tabelle überhaupt keine eindeutigen Spalten hat, können Sie alle Spalten als verwenden Id.

Und wenn Ihre Tabelle eine ID hat, Ihre Entität jedoch nicht, machen Sie daraus eine Embeddable.

  • Bitte, ich bin neu. Wie kann ich alle Spalten als ID in einer Entität mit diesem kleinen Beispiel verwenden: int SIN, int age, String name, String adresse. Danke

    – Omar B.

    9. November 2018 um 15:00 Uhr


  • “Sie können alle Spalten als ID verwenden”, aber meine Tabelle muss identische Zeilen als separate Datensätze speichern können; c

    – Klesun

    14. Juni 2021 um 9:32 Uhr

JPA Entitat ohne ID
Gilbert

Siehe die Java-Persistenz Buchen: Identität und Sequenzierung

Der relevante Teil für Ihre Frage ist der Kein Primärschlüsselabschnitt:

Manchmal hat Ihr Objekt oder Ihre Tabelle keinen Primärschlüssel. Die beste Lösung in diesem Fall besteht normalerweise darin, dem Objekt und der Tabelle eine generierte ID hinzuzufügen. Wenn Sie diese Option nicht haben, gibt es manchmal eine Spalte oder eine Reihe von Spalten in der Tabelle, die einen eindeutigen Wert bilden. Sie können diesen eindeutigen Spaltensatz als Ihre ID in JPA verwenden. Die JPA Id
muss nicht immer mit der Primärschlüsseleinschränkung der Datenbanktabelle übereinstimmen, noch ist ein Primärschlüssel oder eine eindeutige Einschränkung erforderlich.

Wenn Ihre Tabelle wirklich keine eindeutigen Spalten hat, verwenden Sie alle Spalten als ID. In diesem Fall sind die Daten normalerweise schreibgeschützt. Selbst wenn die Tabelle doppelte Zeilen mit denselben Werten zulässt, sind die Objekte trotzdem dieselben, sodass es keine Rolle spielt, dass JPA davon ausgeht, dass es sich um dasselbe Objekt handelt. Das Problem beim Zulassen von Aktualisierungen und Löschungen besteht darin, dass es keine Möglichkeit gibt, die Zeile des Objekts eindeutig zu identifizieren, sodass alle übereinstimmenden Zeilen aktualisiert oder gelöscht werden.

Wenn Ihr Objekt keine ID hat, seine Tabelle jedoch eine, ist dies in Ordnung. Machen Sie das Objekt an Embeddable Objekt, einbettbare Objekte haben keine IDs. Sie benötigen eine Entity das dieses enthält Embeddable zu bestehen und abzufragen.

Ich denke, Sie können verwenden @CollectionOfElements (für Ruhezustand/jpa 1) / @ElementCollection (jpa 2), um eine Sammlung von “Entitätseigenschaften” auf a abzubilden List in entity.

Sie können die erstellen EntityProperty tippen und mit kommentieren @Embeddable

Wenn es eine Eins-zu-Eins-Zuordnung zwischen Entity und Entity_Property gibt, können Sie Entity_ID als Bezeichner verwenden.

993790cookie-checkJPA-Entität ohne ID

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy