插入JPA集合而不加载它



我目前正在使用这样的代码向我的实体中的集合添加一个新条目。

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

它可以工作,但是每次我想添加一个项目时,整个集合都被加载。

  1. 是否有一种方法(可能有查询)添加项目而不加载其余的?在SQL中应该是INSERT INTO AvatarAttributeOwnership(player, data, ...) VALUES({player}, ...);
  2. 目前由SetAvatarAttributeOwnership.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;
    }
    ...
}

尝试extra-lazy collection:

@LazyCollection(LazyCollectionOption.EXTRA)

最新更新