2014-04-17 33 views
6

Ich benutze Hibernate 3.5.6 und MySQL 5.1. Ich habe 3 Klassen: Item, Attribut, AttributeValue. Sie stehen miteinander in einer Eins-zu-Viele-Beziehung und ich bekomme alle Attribute für einen bestimmten Gegenstand. Aber ich bekomme keine AttributeValues ​​für ein bestimmtes Attribut. Ich kann keine Ausnahmen oder Fehler sehen, und die Daten in den Tabellen sehen gut aus, was bedeutet, dass das Einfügen der Daten gut verlief.HIbernate OneToMany FetchType.EAGER gibt keine Werte zurück

Ich habe verschiedene Strategien für FetchMode des Attributs Map of AttributeValues ​​versucht, aber das Ergebnis ist immer leer.

Was habe ich verpasst?

Hier sind die Klassen:

@Entity 
@Table(name = "Item") 
public class Item implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    private String serialNumber; 

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "item", cascade = CascadeType.ALL) 
    @Fetch(value = FetchMode.SELECT) // don't remove this line 
    @MapKey(name = "name") 
    private Map<String, Attribute> attributes = new HashMap<String, Attribute>(); 

    protected Item() { 
     super(); 
    } 

    public Item(String serialNumber) { 
     this(); 
     setSerialNumber(serialNumber); 
    } 

    public String getSerialNumber() { 
     return serialNumber; 
    } 

    protected void setSerialNumber(String serialNumber) { 
     this.serialNumber = serialNumber; 
    } 

    public Map<String, Attribute> getAttributes() { 
     return attributes; 
    } 

    public void setAttributes(Map<String, Attribute> attributes) { 
     this.attributes = attributes; 
    } 
} 

@Entity 
@Table(name = "Attribute", uniqueConstraints = {@UniqueConstraint(columnNames = {"item_serialNumber", "name"})}) 
public class Attribute implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 

    @ManyToOne(cascade = CascadeType.ALL) 
    private Item item; 

    @Column(nullable = false) 
    private String name; 

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "value", cascade = CascadeType.ALL) 
    @Fetch(value = FetchMode.SELECT) 
    @MapKey(name = "value") 
    private Map<String, AttributeValue> values = new HashMap<String, AttributeValue>(); 

    protected Attribute() { 
     super(); 
    } 

    public Attribute(String name) { 
     super(); 
     this.name = name; 
    } 

    public Integer getId() { 
     return id; 
    } 

    protected void setId(Integer id) { 
     this.id = id; 
    } 

    public Item getItem() { 
     return item; 
    } 

    public void setItem(Item item) { 
     this.item = item; 
    } 

    public String getName() { 
     return name; 
    } 

    protected void setName(String newName) { 
     this.name = newName; 
    } 

    public Map<String, AttributeValue> getValues() { 
     return values; 
    } 

    public void setValues(Map<String, AttributeValue> values) { 
     this.values = values; 
    } 

} 

@Entity 
@Table(name = "AttributeValue", uniqueConstraints = {@UniqueConstraint(columnNames = {"attribute_id", "value"})}) 
public class AttributeValue implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 

    @Column 
    private String value; 

    @ManyToOne(cascade = CascadeType.ALL) 
    private Attribute attribute; 

    protected AttributeValue() { 
     super(); 
    } 

    public AttributeValue(String value) { 
     this.value = value; 
    } 

    protected Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public String getValue() { 
     return value; 
    } 

    /** 
    * @param value the value to set 
    */ 
    protected void setValue(String value) { 
     this.value = value; 
    } 

    /** 
    * @return the attribute 
    */ 
    public Attribute getAttribute() { 
     return attribute; 
    } 

    /** 
    * @param attribute the attribute to set 
    */ 
    public void setAttribute(Attribute attribute) { 
     this.attribute = attribute; 
    } 
} 

Und hier ist die SQL der zugrunde liegenden Tabellen:

-- 
-- Table structure for table `Attribute` 
-- 

CREATE TABLE `Attribute` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) NOT NULL, 
    `item_serialNumber` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `item_serialNumber` (`item_serialNumber`,`name`), 
    KEY `FK7839CA7C252F491C` (`item_serialNumber`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

-- -------------------------------------------------------- 

-- 
-- Table structure for table `Item` 
-- 

CREATE TABLE `Item` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `serialNumber` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `serialNumber` (`serialNumber`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

-- -------------------------------------------------------- 

-- 
-- Table structure for table `AttributeValue` 
-- 

CREATE TABLE `AttributeValue` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `value` varchar(255) DEFAULT NULL, 
    `attribute_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `attribute_id` (`attribute_id`,`value`), 
    KEY `FK4C1BA6C69CA0A39A` (`attribute_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

-- 
-- Constraints for dumped tables 
-- 

-- 
-- Constraints for table `Attribute` 
-- 
ALTER TABLE `Attribute` 
    ADD CONSTRAINT `FK7839CA7C252F491C` FOREIGN KEY (`item_serialNumber`) REFERENCES `Item` (`serialNumber`); 

-- 
-- Constraints for table `AttributeValue` 
-- 
ALTER TABLE `AttributeValue` 
    ADD CONSTRAINT `FK4C1BA6C69CA0A39A` FOREIGN KEY (`attribute_id`) REFERENCES `Attribute` (`id`); 

Antwort

3

Sie haben die Karte values in Attribut mit 'Wert' anstelle von 'Attribut' zugeordnet. Die @OneToMany Anmerkung sollte wie unten angegeben werden:

@OneToMany(fetch = FetchType.EAGER, mappedBy = "attribute", cascade = CascadeType.ALL) 
+0

Danke, ich mich, dass vermisste kann nicht glauben. Vielen Dank. – chris

Verwandte Themen