3
respostas

persistir hashmap

olá como eu faço pra persistir isso no hibernate ?

public hashmap<MeuObjeto,int> usos = new hashmap<MeuObjeto,int>();

MeuObjeto e o objeto que tem esse atributo são uma entidade

3 respostas

Você vai ter que mapear esse hash map, exemplo com @MapKeyJoinColumn:

    @OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "order_item_mapping", 
      joinColumns = {@JoinColumn(name = "order_id", referencedColumnName = "id")},
      inverseJoinColumns = {@JoinColumn(name = "item_id", referencedColumnName = "id")})
    @MapKeyJoinColumn(name = "seller_id")
    private Map<Seller, Item> sellerItemMap;

ou usando @MapKey:

    @OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "order_item_mapping", 
      joinColumns = {@JoinColumn(name = "order_id", referencedColumnName = "id")},
      inverseJoinColumns = {@JoinColumn(name = "item_id", referencedColumnName = "id")})
    @MapKey(name = "itemName")
    private Map<String, Item> itemMap;

Deu exception:

Exception in thread "main" org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: teste_hibernate.KPlayer.cooldown[java.lang.Integer]
    at org.hibernate.cfg.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1332)
    at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:870)
    at org.hibernate.cfg.annotations.MapBinder$1.secondPass(MapBinder.java:97)
    at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:53)
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1693)
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1661)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:286)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:83)
    at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:473)
    at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:84)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:689)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:724)
    at teste_hibernate.main.getEntityManager(main.java:25)
    at teste_hibernate.main.main(main.java:30)

esse é o hashmap

    private HashMap<kit, Integer> cooldown = new   HashMap<kit, Integer>();

Como você está usando um map com tipos primitivos (int), O JPA 2.0 suporta coleções primitivas por meio da anotação @ElementCollection que você pode usar em conjunto com o suporte de java.util.Map.

    @ElementCollection
    @MapKeyColumn(name="kit_name")
    @Column(name="kit_value")
    @CollectionTable(name="example_kits", joinColumns=@JoinColumn(name="example_id"))
private HashMap<Kit, Integer> cooldown = new   HashMap<Kit, Integer>();