如何使用JPA将索引集合映射到列表中?

时间:2018-07-19 13:53:36

标签: java jpa eclipselink

我具有以下表格结构:

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"

3 个答案:

答案 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