我具有以下表格结构:
Table: PARENT
ID NUMBER
NAME VARCHAR
Table: CHILDREN
PARENT_ID NUMBER,
FIELD NUMBER,
VALUE VARCHAR
将其映射到以下结构中的正确方法是什么?
class Parent {
int id;
String name;
/* MAPPING HERE, where FIELD is the list's index number */
List<String> children; // <-- Preferably
/* OR */
/* MAPPING HERE, where FIELD is the key */
Hashtable<Integer,String> children;
}
我已经使用以下注释将其设置为可用于哈希表版本:
@ElementCollection
@CollectionTable(name = "CHILDREN",joinColumns=@JoinColumn(name="PARENT_ID"))
@MapKeyColumn(name = "FIELD")
@Column(name = "VALUE")
但是当VALUE为null时,它将引发错误。因为Hashtable不允许空值。我尝试了HashMap,但出现此错误。
The attribute is of type [class java.util.HashMap] but the mapping uses transparent indirection (lazy loading), requiring it to be a superclass of [IndirectMap].
使用EclipseLink。
**编辑:
假设数据如下:
CHILDREN
PARENT_ID, FIELD, VALUE
1, 0, "value 0"
1, 1, NULL
1, 2, "value 2"
然后我的列表应如下所示:
[ "value 0", NULL, "value 2 ]
或者我的哈希表:
0: "value 0"
1: null (or no-entry)
2: "value 2"
答案 0 :(得分:0)
使用数组或常规列表,在Parent的子级列表上方带有批注@OneToMany。当您启动游览代码时,它应该创建一个表格以在父母和孩子之间进行舔食。
答案 1 :(得分:0)
我能够使Hashtable实现起作用,并且通过向空字符串转换器添加null来避免null值问题。因此,当值发送到哈希表的put()时,它是一个空字符串,而不是null。像这样:
@ElementCollection
@CollectionTable(name = "CHILDREN",joinColumns=@JoinColumn(name="PARENT_ID"))
@MapKeyColumn(name = "FIELD")
@Column(name = "VALUE")
@Converter(converterClass = NullEmptyStringConverter.class, name = "nullEmptyStringConverter")
@Convert( "nullEmptyStringConverter" )
Hashtable<Integer,String> children;
使用:
public class NullEmptyStringConverter implements Converter {
@Override
public Object convertDataValueToObjectValue(Object arg0, Session arg1) {
return ( arg0 == null ? "" : arg0 );
}
}
所以不是我偏爱的解决方案,但这似乎是我能得到的最好的解决方法。
答案 2 :(得分:0)
使用HashMap
时的错误消息是不言自明的。为了延迟加载集合,Hibernate需要使用自定义映射实现(IndirectMap
)来代理它。但是,由于您声明children
为具体类型HashMap
,所以它无法做到。
解决方案不是强制children
成为Hashmap
。请改用Map
。