Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 具有分离实体的查询的JPA成员_Hibernate_Jpa_Orm_Jpa 2.0 - Fatal编程技术网

Hibernate 具有分离实体的查询的JPA成员

Hibernate 具有分离实体的查询的JPA成员,hibernate,jpa,orm,jpa-2.0,Hibernate,Jpa,Orm,Jpa 2.0,我想做一个简单的JPA成员的查询,但我不能为我的生活让它工作。Hibernate抛出TransientObjectException,消息为“对象引用未保存的临时实例-在刷新之前保存实例:标记”。查询如下: public Collection<ItemDescription> getItems(){ String entityClass = "ItemDescription"; TypedQuery<ItemDescription> query = ent

我想做一个简单的JPA成员的查询,但我不能为我的生活让它工作。Hibernate抛出TransientObjectException,消息为“对象引用未保存的临时实例-在刷新之前保存实例:标记”。查询如下:

public Collection<ItemDescription> getItems(){
    String entityClass = "ItemDescription";
    TypedQuery<ItemDescription> query = entityManager.createQuery(
            "SELECT i FROM " + entityClass +" i " +
            "WHERE :tag MEMBER OF i.tags", ItemDescription.class);
    query.setParameter("tag", new Tag("category:test"));
    List<ItemDescription> resultList = query.getResultList();
    return resultList;
}
@Entity
@Table(name = "tags")
public class Tag extends AbstractDomainEntity {
    private static final long serialVersionUID = 2632379096725992272L;
    private String value;
    ...
}

@Entity
@Table(name = "itemdescriptions")
public class ItemDescription extends AbstractDomainEntity {
    private static final long serialVersionUID = 9164310940207023539L;
    private Set<Tag> tags = new HashSet<Tag>();
    ...
    @OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL, orphanRemoval = true)
    public Set<Tag> getTags() {
        return tags;
    }
    private void setTags(Set<Tag> tags) {
        this.tags = tags;
    }
}
公共集合getItems(){ 字符串entityClass=“ItemDescription”; TypedQuery查询=entityManager.createQuery( 从“+entityClass+“i”中选择i+ “其中:i.tags的标记成员”,itemsdescription.class); setParameter(“标记”,新标记(“类别:测试”); List resultList=query.getResultList(); 返回结果列表; } 这两个实体类如下所示:

public Collection<ItemDescription> getItems(){
    String entityClass = "ItemDescription";
    TypedQuery<ItemDescription> query = entityManager.createQuery(
            "SELECT i FROM " + entityClass +" i " +
            "WHERE :tag MEMBER OF i.tags", ItemDescription.class);
    query.setParameter("tag", new Tag("category:test"));
    List<ItemDescription> resultList = query.getResultList();
    return resultList;
}
@Entity
@Table(name = "tags")
public class Tag extends AbstractDomainEntity {
    private static final long serialVersionUID = 2632379096725992272L;
    private String value;
    ...
}

@Entity
@Table(name = "itemdescriptions")
public class ItemDescription extends AbstractDomainEntity {
    private static final long serialVersionUID = 9164310940207023539L;
    private Set<Tag> tags = new HashSet<Tag>();
    ...
    @OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL, orphanRemoval = true)
    public Set<Tag> getTags() {
        return tags;
    }
    private void setTags(Set<Tag> tags) {
        this.tags = tags;
    }
}
@实体
@表(name=“tags”)
公共类标记扩展了AbstractDomainEntity{
私有静态最终长serialVersionUID=2632379096725992272L;
私有字符串值;
...
}
@实体
@表(name=“itemdescriptions”)
公共类ItemDescription扩展了AbstractDomainEntity{
私有静态最终长serialVersionUID=9164310940207023539L;
private Set tags=new HashSet();
...
@OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL,orphan=true)
公共集getTags(){
返回标签;
}
专用无效设置标记(设置标记){
this.tags=标签;
}
}
当我使用从实体管理器检索到的标记对象作为查询参数时,同样的查询也会起作用。“tag”参数真的必须是托管实体吗?为什么?我怎样才能使查询正常工作?谢谢你们的帮助

[编辑:] 谢谢你的提示。我现在以以下问题结束:

public Collection<ItemDescription> getItems(){
    String entityClass = "ItemDescription";
    TypedQuery<ItemDescription> query = entityManager.createQuery(
            "SELECT i FROM " + entityClass +" i " +
            "JOIN i.tags t " +
            "WHERE t.value = :tag", ItemDescription.class);
    query.setParameter("tag", "category:test");
    List<ItemDescription> resultList = query.getResultList();
    return resultList;
}
公共集合getItems(){ 字符串entityClass=“ItemDescription”; TypedQuery查询=entityManager.createQuery( 从“+entityClass+“i”中选择i+ “加入i.t”+ “其中t.value=:tag”,itemsdescription.class); query.setParameter(“标记”、“类别:测试”); List resultList=query.getResultList(); 返回结果列表; }
当事务提交时,持久性上下文中的所有对象都与基础数据库同步。因此,当您设置实体管理器检索的对象时,该对象可以正常工作,因为该对象处于托管状态

这里,您正在创建一个新对象&将其设置为事务中查询的参数,在分离对象时会导致异常

来自文档:

当用户将临时实例传递给会话方法时引发 这需要一个持久实例


正如Nayan Wadekar所说,i.tags的
:memberParameter成员需要一个持久实例

所以这里有两种解决方法

  • 确保传入标记对象的已持久实例
  • 如果无法执行此操作,则可以通过连接查询按“标记”-名称进行查询:

    SELECT i FROM ItemDescription i JOIN c.tags t
    WHERE t.name LIKE :name
    

  • 谢谢你的回答。我认为这是支持的,因为我在这里看到了这样一个例子,所以我猜他的例子也不起作用。