[英]HIbernate OneToMany FetchType.EAGER not returning values
I use Hibernate 3.5.6 and MySQL 5.1. 我使用Hibernate 3.5.6和MySQL 5.1。 I have 3 classes: Item, Attribute, AttributeValue. 我有3个类:Item,Attribute,AttributeValue。 They relate to each other with a One-to-Many relationship, and I do get all Attributes for a given Item. 它们以一对多的关系彼此相关,我确实得到了给定项目的所有属性。 But I don't get AttributeValues for a given Attribute. 但我没有得到给定属性的AttributeValues。 I cannot see exceptions or errors, and data in the tables looks good, meaning that insertion of the data went well. 我看不到异常或错误,表中的数据看起来很好,这意味着数据的插入进展顺利。
I have tried different strategies for FetchMode of Attribute's map of AttributeValues, but result is always empty. 我为Attribute的AttributeValues映射的FetchMode尝试了不同的策略,但结果总是为空。
What have I missed? 我错过了什么?
Here are the classes: 以下是课程:
@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;
}
}
And here is the SQL of the underlying tables: 这是基础表的SQL:
--
-- 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`);
You have mapped the values
map in Attribute using 'value' instead of 'attribute'. 您已使用“值”而不是“属性”在属性中映射values
映射。 The @OneToMany annotation should be specified as below: @OneToMany注释应指定如下:
@OneToMany(fetch = FetchType.EAGER, mappedBy = "attribute", cascade = CascadeType.ALL)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.