Вставить в коллекцию JPA, не загружая ее

В настоящее время я использую подобный код, чтобы добавить новую запись в набор в моей сущности.

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

Это работает, но каждый раз, когда я хочу добавить один элемент, загружается весь набор.

  1. Есть ли способ (возможно, с запросом) добавить элемент без загрузки остальных? В SQL это будет что-то вроде INSERT INTO AvatarAttributeOwnership (player, data, ...) VALUES ({player}, ...);
  2. В настоящее время уникальность поддерживается контрактом Set ] и AvatarAttributeOwnership.equals , но я предполагаю, что это больше не будет работать. Как я могу его применить?

Я использую JPA2 + Hibernate. Код:

@Entity
public class Player implements Serializable {

    @Id
    @GeneratedValue
    private long id;

    @ElementCollection(fetch=FetchType.LAZY)
    // EDIT: answer to #2
    @CollectionTable(uniqueConstraints=@UniqueConstraint(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;
    }

    ...

}
7
задан Bart van Heukelom 25 July 2011 в 14:34
поделиться