Карта проблемы с JPA / Hibernate / PG - PullRequest
4 голосов
/ 19 января 2009

У меня есть две сущности, Entity1 и Entity2, в отношениях один ко многим. На Entity1 у меня есть карта, которая содержит записи.

Код, который я использую для сохранения нового Entity1 с некоторым Entity2 на карте, выглядит следующим образом:

   Entity1 e1 = new Entity1();  
   Entity2 e2 = null;  
   e1.setE2s(new HashMap<String, Entity2>());
   for (String key : someKeySet()){
      e2 = new Entity2();
      e2.setCode(key);                      
      e2.setSwhon(true);        
      e2.setE1(e1);
      e1.getE2s(key, e2);       
      em.persist(e1.getE2s().get(key));         

    }       
    em.persist(e1);
    em.flush();

и вот выдержка из сущностей:

@Entity
@Table(name = "wm_Entities1")  
public class Entity1 implements Serializable {  
   private static final long serialVersionUID = 6592708276573465599L;  
   private Map<String, Entity2> e2s;
   private Long id;  
   @Id  
   @GeneratedValue(strategy=GenerationType.TABLE)  
   public long getId() {  
    return id;  
   }  
   public void setId(long id) {  
    this.id = id;  
   }  
   public void setE2s(Map<String, Entity2> e2s){    
    this.e2s = e2s;
   }       
   @OneToMany(mappedBy = "e1", fetch = FetchType.EAGER)  
   public Map<String, Entity2> getE2s() {  
    return e2s;  
   }  
}

@Entity
@Table(name = "wm_Entities2")
public class Entity2 implements Serializable {  
    private static final long serialVersionUID = -6131765066573346790L; 
    private long id;
    private Entity1 e1;
    @Id
    @GeneratedValue(strategy=GenerationType.TABLE)
    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }
    @ManyToOne()
    @JoinColumn(name="e1_id")
    public Entity1 getE1() {
        return this.e1;
    }
    public void setE1(Entity1 e1) {
        this.e1 = e1;
    }
}

Кажется, это работает нормально, поскольку он вставляет обе сущности в базу данных pg, но суть в том, что он не создает, а сохраняет MapKey для e2 в базе данных (теоретически JPA генерирует этот ключ), поэтому, когда я получаю e1 назад, и я пытаюсь получить карту e2s от него, у меня есть:

javax.ejb.EJBException: org.hibernate.HibernateException: null индексный столбец для коллекции:

Как мне сохранить этот MapKey сохраненным ??

Примечание: я использую JavaEE с JPA / Hibernate, работаю над JBoss 4.2, с PGSQL DB.

1 Ответ

2 голосов
/ 20 января 2009

В вашем коде есть некоторые странности ... Но, похоже, вы должны добавить аннотацию @MapKey в Entity1:

(snippet)
@OneToMany(mappedBy = "e1", fetch = FetchType.EAGER)
@MapKey(name="iCantFigureTheRightPropertyName")
public Map<String, Entity2> getE2s() {  
    return e2s;  
}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...