Heim  >  Fragen und Antworten  >  Hauptteil

Wie Hibernate mit Entitätsklassen mit variabler Anzahl von Parametern umgeht

Angenommen, ein Objekt hat mehrere Parameter und der Name und die Anzahl der Parameter sind unsicher. Ich würde gerne wissen, wie die Datentabelle in diesem Fall so gestaltet sein sollte, dass sie für den Betrieb von Hibernate besser geeignet ist.
Ich habe eins ausgearbeitet Vorherige Lösung (ich möchte die Beschwerde des Meisters hören):
Es werden insgesamt zwei Tabellen verwendet: eine ist die Tab-Tabelle und die andere ist die Tabmeta-Tabelle, und die TID in der Tabmeta-Tabelle wird auf die Tab-ID verwiesen, um eine zu erstellen Fremdschlüssel (tatsächlich möchte ich diese Beziehung nicht in der Datenbank erstellen, sondern einen Fremdschlüssel im Programm erstellen. Oder die DAO-Schicht implementiert eine solche Beziehung).

Erstellen Sie die entsprechende Entitätsklasse ( direkt über die Tabelle mithilfe von Reverse Engineering von InteliJ IDEA generiert):

//tab的实体类
@Entity
@Table(name = "tab", schema = "springfkhibernate", catalog = "")
public class TabEntity {
    private int id;
    private String name;
    private Map<Object, TabmetaEntity> tabmetasById;
    //省略一些该有的函数和geter seter

    @MapKey(name = "metakey")
    @OneToMany(mappedBy = "tabByTid")
    public Map<Object, TabmetaEntity> getTabmetasById() {
        return tabmetasById;
    }

    public void setTabmetasById(Map<Object, TabmetaEntity> tabmetasById) {
        this.tabmetasById = tabmetasById;
    }
}
//tabmeta的实体类
@Entity
@Table(name = "tabmeta", schema = "springfkhibernate", catalog = "")
public class TabmetaEntity {
    private int id;
    private String metakey;
    private String metavalue;
    //省略该有的getter和setter
}

Parameter beim Generieren:

Aber dadurch entstehen zwei Entitätsklassen, eine ist TabEntity und die andere ist TabValueEntity. Ursprünglich beschreiben diese beiden Tabellen das Problem einer Entität Eine Eins-zu-Viele-Beziehung zwischen zwei Objekten möchte ich nun fragen, ob es möglich ist, in TabEntity eine Variable Metas vom Typ (Hash)Map vorzubereiten, sodass nur eine Entitätsklasse vorhanden ist Wie sollen die Daten in diesem Fall wieder in der Datenbank gespeichert werden?
Wenn Sie auf einen der variablen Parameter in der so generierten Entitätsklasse zugreifen möchten, benötigen Sie:
TabDao.getEntity(...) .getTabmetasById().get('somekey').getMetaValue()TabDao.getEntity(...).getTabmetasById().get('somekey').getMetaValue()
来实现,但是如果把这两个表的数据理解成一个实体的数据的话就应该这么实现:
TabDao.getEntity(...).getMeta('somekey'), aber wenn die Daten dieser beiden Tabellen als Daten einer Entität verstanden werden, sollte es wie folgt aussehen: Implementierung:
TabDao .getEntity(...).getMeta('somekey')
Ich weiß nicht, ob der Meister diesbezüglich Vorschläge hat....
Ich möchte auch nach der Beziehung des Meisters zu IDEA What fragen Welchen Einfluss hat jeder Parameter im erstellten Dialogfeld?

Ich bin ziemlich verwirrt, ich hoffe, die Götter können mich aufklären 🎜
我想大声告诉你我想大声告诉你2734 Tage vor570

Antworte allen(1)Ich werde antworten

  • 滿天的星座

    滿天的星座2017-05-17 10:08:59

    又到了自问自答的环节....
    如果说实现我上面说的那种方式,还要实现LazyLoad,IDEA自动生成基本上是没戏的....那个生成的功能是不包括建立非对象之间的关系的,如果需要建立,只能自己去改映射文件.先把那个tab表的实体类生成出来,然后在tab的实体类中添加一个Map类型的对象(具体映射的类型看另一个表的字段数据类型),生成对应的geter和seter函数.
    然后就是map文件:

    <map name="values" table="tabmeta">
        <key column="tid" foreign-key="id"/><!--虚拟外键:谁和谁相等代表关系-->
        <index column="meta_key" type="string"/><!--Map的Key是谁-->
        <element column="meta_value" type="double"/><!--Map的Value是谁-->
    </map>

    Antwort
    0
  • StornierenAntwort