2011-07-25 12 views
6

Actualmente estoy usando un código como este para agregar una nueva entrada a un conjunto en mi entidad.Insertar en la colección JPA sin cargarlo

player = em.find(Player.class, playerId); 
player.getAvatarAttributeOwnership().add(new AvatarAttributeOwnership(...)); 

Funciona, pero cada vez que quiero agregar un elemento, se carga todo el conjunto.

  1. ¿Hay alguna manera (con una consulta tal vez) de agregar el artículo sin cargar el resto? En SQL sería algo así como INSERT INTO AvatarAttributeOwnership(player, data, ...) VALUES({player}, ...);
  2. Actualmente la exclusividad se mantiene mediante el contrato de Set y AvatarAttributeOwnership.equals, pero supongo que ya no funcionará. ¿Cómo puedo aplicarlo de todos modos?

Estoy usando JPA2 + Hibernate. Código:

@Entity 
public class Player implements Serializable { 

    @Id 
    @GeneratedValue 
    private long id; 

    @ElementCollection(fetch=FetchType.LAZY) 
    // EDIT: answer to #2 
    @CollectionTable([email protected](columnNames={"Player_id","gender","type","attrId"})) 
    Set<AvatarAttributeOwnership> ownedAvatarAttributes; 

    ... 

} 

@Embeddable 
public class AvatarAttributeOwnership implements Serializable { 

    @Column(nullable=false,length=6) 
    @Enumerated(EnumType.STRING) 
    private Gender gender; 

    @Column(nullable=false,length=20) 
    private String type; 

    @Column(nullable=false,length=50) 
    private String attrId; 

    @Column(nullable=false) 
    private Date since; 

    @Override 
    public boolean equals(Object obj) { 

     if (this == obj) return true; 
     if (obj == null) return false; 
     if (getClass() != obj.getClass()) return false; 

     AvatarAttributeOwnership other = (AvatarAttributeOwnership) obj; 

     if (!attrId.equals(other.attrId)) return false; 
     if (gender != other.gender) return false; 
     if (!type.equals(other.type)) return false; 

     return true; 
    } 

    ... 

} 
+0

¿Ha confirmado mis obras sugerencia? – Bozho

+0

@Bozho Todavía no, ya que actualmente necesito enfocarme en hacer que otras cosas funcionen en lugar de optimizar esto, pero supongo que funciona. –

+0

También asumo, pero no lo he probado, por lo que puedes desmarcar la respuesta aceptada por ahora :) – Bozho

Respuesta

Cuestiones relacionadas