So senden Sie den Namen, Wertpaar über Java Map in Hibernate zurück (Verwenden der Mapping -Datei)

StackOverflow https://stackoverflow.com/questions/4547873

  •  13-10-2019
  •  | 
  •  

Frage

Ich versuche, einen Namen, ein Wertpaar in Hibernate, zu erstellen, das als Java -Karte zurückgegeben wird. Aber ich bekomme nur 1 der Reihen auf der Karte zurückgekehrt. Ich habe keine wirklich klaren Beispiele für eine einfache Karte wie diese gefunden und ich kann nicht sehen, was ich falsch mache.

Aufgrund einer eingeschränkten Umgebung kann ich HBM2DLL nicht ausführen, um die Tabelle zu generieren. Deshalb habe ich sie von Hand generiert und es ist möglich, dass ich dort Fehler habe.

Hier sind meine Eltern- und Kindertische:

mysql> select * from zoomProperties;
+----+---------------+
| id | entityVersion |
+----+---------------+
|  1 |             0 | 
+----+---------------+
1 row in set (0.00 sec)

mysql> select * from zoomProperty;
+----+-------+-------+----------------------+
| id | name  | value | parentZoomProperties |
+----+-------+-------+----------------------+
|  1 | prop1 | val1  |                    1 | 
|  2 | prop2 | val2  |                    1 | 
|  3 | prop3 | val3  |                    1 | 
+----+-------+-------+----------------------+
3 rows in set (0.00 sec)

Aber ich bekomme nur einen Wert zurück:

2010-12-28 16:45:58,437 ERROR [STDERR] setProperties with:
2010-12-28 16:45:58,453 ERROR [STDERR]  Key: prop1
2010-12-28 16:45:58,453 DEBUG [com.mycompany.zoom] Query returns 1 ZoomProperties
2010-12-28 16:45:58,453 ERROR [STDERR] getProperties returning:
2010-12-28 16:45:58,454 ERROR [STDERR]  Key: prop1
2010-12-28 16:45:58,454 DEBUG [com.mycompany.zoom] Key: prop1, Value: val1
2010-12-28 16:45:58,454 DEBUG [com.mycompany.zoom] ZoomProperies returned 1 properties

Hier ist meine Hibernate -Frage:

List resultList = em.createQuery("from ZoomProperties").getResultList();
log.debug("Query returns " + resultList.size() + " ZoomProperties");

Hier ist meine Mapping -Datei:

<hibernate-mapping>
  <class name="com.mycompany.zoom.domain.ZoomProperties" table="zoomProperties">
    <id name="id">
      <generator class="increment"/>
    </id>
    <version name="entityVersion"/>

    <map name="properties" table="zoomProperty">
      <key column="id"/>
      <map-key column="name" type="string"/>
      <element column="value" type="string"/>
    </map>
  </class>
</hibernate-mapping>

Und mein Pojo:

package com.mycompany.zoom.domain;

import java.util.HashMap;
import java.util.Map;

public class ZoomProperties
{
    private Long id;
    private Map<String, String> properties = new HashMap<String, String>();
    private Integer entityVersion;

    public ZoomProperties() {}

    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }

    public Map<String, String> getProperties() //{ return properties; }
    {
        System.err.println("getProperties returning:");
        java.util.Set<String> propertyKeySet = properties.keySet();
        for (String key : propertyKeySet)
        {
            System.err.println("\tKey: " + key);
        }
        return properties;
    }
    public void setProperties(Map<String, String> properties) //{ this.properties = properties; }
    {
        this.properties = properties;
        System.err.println("setProperties with:");
        java.util.Set<String> propertyKeySet = properties.keySet();
        for (String key : propertyKeySet)
        {
            System.err.println("\tKey: " + key);
        }
    }

    public Integer getEntityVersion() { return entityVersion; }
    public void setEntityVersion(Integer entityVersion) { this.entityVersion = entityVersion; }

    public boolean equals(Object other) {
        if (other == this)
        {
            return true;
        }
        if (other instanceof ZoomProperties)
        {
            return true;
        }
        return false;
    }

    public int hashCode() {
        return "This is the one and only ZoomProperties".hashCode();
    }
}

Und meine Tischerstellungsinformationen:

mysql> show create table zoomProperties;
+----------------+---------------------------------+
| Table          | Create Table                    |
+--------------------------------------------------+
| zoomProperties | CREATE TABLE `zoomProperties` (
  `id` bigint(20) NOT NULL auto_increment,
  `entityVersion` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1             | 
+----------------+---------------------------------+
1 row in set (0.00 sec)

mysql> show create table zoomProperty;
+--------------+-----------------------------------+
| Table        | Create Table                      |
+--------------+-----------------------------------+
| zoomProperty | CREATE TABLE `zoomProperty` (
  `id` bigint(20) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL,
  `value` varchar(255) default NULL,
  `parentZoomProperties` bigint(20) default NULL,
  PRIMARY KEY  (`id`),
  KEY `parentZoomProperties` (`parentZoomProperties`),
  CONSTRAINT `zoomProperty_ibfk_1` 
    FOREIGN KEY (`parentZoomProperties`) 
    REFERENCES `zoomProperties` (`id`) 
    ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1             | 
+--------------+-----------------------------------+
1 row in set (0.00 sec)
War es hilfreich?

Lösung

<key> Element im Inneren <map> bezieht sich auf den fremden Schlüssel, also sollte es sein

<map name="properties" table="zoomProperty">
    <key column="parentZoomProperties"/>
    <map-key column="name" type="string"/>
    <element column="value" type="string"/>
</map>

id in zoomProperty Tabelle wird überhaupt nicht benötigt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top