为什么getReference会立即生成select

时间:2016-10-29 23:39:27

标签: java spring hibernate jpa

我正在使用带有JPA + Hibernate的spring,而我从JpaRepository调用getReference或getOne时会调用select,但所有值仍然保持为null。如何阻止选择被调用。我希望能够直接使用引用直接添加链接而无需获取它们。实体映射基于http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#associations-many-to-many-bidirectional-with-link-entity

Entitity

@Entity(name = "Parent")
public class Parent implements Serializable{

@Id
@GeneratedValue
private Integer id;


@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval =  true)
private List<ParentChild> children = new ArrayList<>();

public void addChild(Child child){
    ParentChild parentChild = new ParentChild(this,child);
    this.children.add(parentChild);
    child.getParents().add(parentChild);
}

@Override
public boolean equals(Object o) {
    if ( this == o ) {
        return true;
    }
    if ( o == null || getClass() != o.getClass() ) {
        return false;
    }
    Parent u = (Parent)o;
    return Objects.equals( id, u.id );
}

@Override
public int hashCode() {
    return Objects.hash( id );
}
}

服务功能

@Override
@Transactional
public void linkChildToParent(Integer childId, Integer parentId){
        Parent parent = em.getReference(Parent.class,parentId);
        Child child = em.getReference(Child.class,childId);
        parent.addChild(child);
}

在我访问任何属性之前,两个引用都会调用select。

1 个答案:

答案 0 :(得分:0)

您可以向getIdParent类添加公开Child方法,将@Id@GeneratedValue注释移至这些方法并重试吗?

根据Java Persistence with Hibernate的书,调用代理上的任何方法都不是&#34;识别getter&#34;将触发代理的初始化并命中数据库。