插入JPA集合而不加载它

时间:2011-07-25 10:42:41

标签: java hibernate jpa fetch jpql

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

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

它有效,但每次我想添加一个项目时,都会加载整个集合。

  1. 是否有办法(可能有查询)添加项目而不加载其余项目?在SQL中,它将类似于INSERT INTO AvatarAttributeOwnership(player, data, ...) VALUES({player}, ...);
  2. 目前唯一性由SetAvatarAttributeOwnership.equals的合同维护,但我认为这将不再适用。我怎么能强制执行呢?
  3. 我正在使用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;
        }
    
        ...
    
    }
    

1 个答案:

答案 0 :(得分:5)

尝试extra-lazy collections

@LazyCollection(LazyCollectionOption.EXTRA)