2013-08-17 3 views
0

У меня есть простой пример сопоставления JPA, включая карту. TestEntity имеет карту объектов SubEntity-Objects и некоторых ключей. Я бы ожидал, что ключи карты будут сохранены. Вместо этого они равны нулю. Вот код:Карта карты JPA2.0 не сохраняется

@Entity 
public class TestEntity { 

    @OneToMany 
    public Map<String, SubEntity> map = new HashMap<String, SubEntity>(); 

    @Id 
    @GeneratedValue(strategy = AUTO) 
    protected long id; 

    public String name; 

    public TestEntity() { 
    } 

    public TestEntity(String name) { 
     this.name = name; 
    } 
} 

Это subentity:

@Entity 
public class SubEntity { 

    @Id 
    @GeneratedValue(strategy = AUTO) 
    protected long id; 

    public SubEntity() { 
    } 

    String subEntityName; 

    public SubEntity(String name) { 
     this.subEntityName = name; 
    } 
} 

А вот тестовый код:

EntityManager em = EntityManagerService.getEntityManager(); 
em.getTransaction().begin(); 

for (int i = 0; i < 10; i++) { 
    TestEntity e = new TestEntity("MyNameIs" + i); 
    for (int j = 0; j < 8; j++) { 
     SubEntity se = new SubEntity("IamNo" + j + "." + i); 
     e.map.put("Key" + i * 100 + j, se); 
     em.persist(se); 
    } 
    em.persist(e); 
} 

em.getTransaction().commit(); 

Все объекты создаются и хранятся. Только ключевые значения в таблице сопоставления являются нулевыми. Где моя ошибка? Я использую JPA2 с eclipselink2.4.1 и Derby 10.

+0

«Вместо этого они есть». - какие? – contradictioned

ответ

0

Наконец-то я нашел объяснение: Это ошибка в eclipselink. Об ошибке сообщается для версии 2.3.1. Я использовал 2.4.1, и он, похоже, не исправлен. Вот связанный question. Первый ответ очень помогает: хотя значения по умолчанию для @JoinTable и @MapKeyColumn создают правильные вкладки и столбцы, просто добавьте их явно. Мой пример сверху выглядит так:

@Entity 
public class TestEntity { 

    @OneToMany 
    // add these annotations for a work-around 
    @JoinTable(name="TESTENTITY_SUBENTITY") 
    @MapKeyColumn(name = "MAP_KEY", table="TESTENTITY_SUBENTITY") 
    public Map<String, SubEntity> map = new HashMap<String, SubEntity>(); 

    @Id 
    @GeneratedValue(strategy = AUTO) 
    protected long id; 

    public String name; 

    public TestEntity() { 
} 

    public TestEntity(String name) { 
     this.name = name; 
    } 
} 

С этими двумя дополнительными строками ключи хранятся. Созданные таблицы выглядят как that.

0

JPA 2.0 поддерживает коллекции примитивов через аннотацию @ElementCollection, которую вы можете использовать в сочетании с поддержкой коллекций java.util.Map. Нечто подобное должно работать:

@Entity 
public class Example { 
    @Id long id; 
    // .... 
    @ElementCollection 
    @MapKeyColumn(name="name") 
    @Column(name="value") 
    @CollectionTable(name="example_attributes", [email protected](name="example_id")) 
    Map<String, String> attributes = new HashMap<String, String>(); // maps from attribute name to value 

} 
+0

Ну, это может сработать. Но проблема, которую я описал выше, связана с картой объектов: в моем примере карты имеют нетривиальные значения. И удивительно то, что все работает нормально - только ключи не хранятся, а столбец содержит нули. –

0

Используйте @MapKey указать атрибут целевого объекта (SubEntity), который служит в качестве ключа для карты.

Или используйте @MapKeyColumn, чтобы указать, что ключ должен храниться в дополнительном столбце, не отображаемом в SubEntity.

В javadoc приводятся примеры.

+0

Значения по умолчанию для этих значений работают нормально. Для меня проблема больше похожа на проблему в eclipselink. Я проверю это. –

Смежные вопросы