Wie man die Spaltennamen der JPA-entity
Alle meine JPA entity Klassen implementieren eine Schnittstelle namens Einheiten, die wie folgt definiert sind:
public interface Entity extends Serializable {
//some methods
}
Einige der Felder in meinem JPA entity haben @Column
annotation auf der Oberseite von Ihnen und einige nicht. MyEntity
Klasse ist definiert wie folgt:
@Entity
public class MyEntity implements Entity {
@Id
private Long id; //Assume that it is auto-generated using a sequence.
@Column(name="field1")
private String field1;
private SecureString field2; //SecureString is a custom class
//getters and setters
}
Mein delete-Methode akzeptiert ein Unternehmen.
@Override
public void delete(Entity baseEntity) {
em.remove(baseEntity); //em is entityManager
}
Wenn Sie die delete-Methode aufgerufen wird, möchte ich drei Dinge in meinem delete-Methode:
1) Felder der MyEntity
Typ SecureString
2) Spalte name der jeweiligen Feld in der DB (Das Feld kann oder auch nicht haben @Column
annotation)
3) der Wert Der id
Feld
Beachten Sie, dass, wenn die delete()
Methode wird aufgerufen, und wir wissen nicht, für welche Stelle Sie aufgerufen wird, kann es für MyEntity1
, MyEntity2
etc.
Habe ich versucht etwas zu tun, wie unten:
for (Field field : baseEntity.getClass().getFields()) {
if (SecureString.class.isAssignableFrom(field.getType())) {
//But the field doesn't have annotation @Column specified
Column column = field.getAnnotation(Column.class);
String columnName = column.name();
}
}
Aber das wird nur funktionieren, wenn das Feld hat @Column
annotation. Auch er will mich nicht anderen zwei Dinge, die ich brauche. Irgendwelche Ideen?
Column name of that particular field in DB (The field may or may not have '@Column' annotation)..
Sind Sie bei der Erstellung der Datenbank-Tabellen oder die Möglichkeit für den Ruhezustand, um Sie zu erstellen? Wenn hibernate erstellen und Sie haben nicht erwähnt das '@Column' name der variable wird als default für die Spalte name.- ich bin so dass hibernate die zum erstellen der Datenbank-Tabellen. Einige Felder haben '@Spalte' annotation und einige nicht. Ich Stimme mit Ihnen auf Ihre Letzte Aussage. Ich muss eine Bedingung zu überprüfen, ob ein bestimmtes Feld, ist versehen mit '@Column' oder nicht, und basierend auf dieser Spalte name geholt werden soll.
- Hibernate liest eine ganze Zeile und alle Spalten, die besonders Zeile, und speichert es in der jeweiligen Einheit. Sie können die Werte für diese Variablen über die Get-Methoden zur Verfügung gestellt, die in Ihrer Einheit.
- Und wie konvertiert man die Entity-Referenz zur Benutzeroberfläche Referenz zur Klasse MyEntity (da ich nicht weiß, dass die Instanz von MyEntity, so kann ich nicht einen direkten cast. Kann es sein MyEntity1, MyEntity2 etc.)? Einmal habe ich das Objekt, die ich noch brauchen, um zu bestimmen, welche der Attribute ist auf SecureString-Typ und die bekommen Ihren Wert,wie kann ich das erreichen? Könnten Sie vorschlagen, eine Antwort?
- (da ich nicht weiß, dass die Instanz von MyEntity.) Meinst du, dass Sie nicht wissen, welche Zeile Sie versuchen, Sie zu Holen?
- liest eine ganze Zeile und alle Spalten" - Nein, Spalten sind explizit aufgeführt in der Abfrage, d.h. niemals auftreten
select *
- Ich meinte, dass das delete () - Methode akzeptiert eine Schnittstelle, so dass innerhalb der Methode wissen wir nicht, für welche Klasse Sie aufgerufen wird. Ich habe rund 100 Personen in meiner Bewerbung und alle von Ihnen sind von der Implementierung dieser Schnittstelle.
- Frage sehr interessant (für mich). Ich persönliche Lösung gleichermaßen hibernate-basierte Antwort oben. Existiert tragbaren, reinen JPA Antwort? Möglich ist das schreiben eigener Reflexion 'parser', implementieren alle JPA-Regeln, aber das ist reinvetiong Rad
Du musst angemeldet sein, um einen Kommentar abzugeben.
Überwintern können verschiedene naming-Strategien map Namen der Eigenschaft, die definiert sind implizit (ohne @Column(name = "...")). Eine "physische" Namen, die Sie brauchen, um zu Tauchen in Hibernate-Interna. Erste, Sie haben zu Draht ein
EntityManagerFactory
zu Ihrem service.Zweiten, haben Sie, um eine
AbstractEntityPersister
für Ihre KlasseDritten, Sie sind fast mit Ihrem code. Sie müssen nur an-Griff beiden Fällen - mit und ohne @Column-annotation. Versuchen Sie dies:
Beachten Sie, dass
getPropertyColumnNames()
ruft nur 'Eigenschaft' Felder, die nicht Teil des Primärschlüssels. Zum abrufen von Schlüssel-Spalte-Namen, verwenden SiegetKeyColumnNames()
.Und über
id
Feld. Brauchst du wirklich alle @Id ' s in den child-Klassen? Vielleicht wäre besser zu bewegen @IdEntity
Klasse und markieren Sie diese Klasse mit @MappedSuperclass annotation? Dann können Sie es abrufen, nur mitbaseEntity.getId();