Hibernate 具有分离实体的查询的JPA成员
我想做一个简单的JPA成员的查询,但我不能为我的生活让它工作。Hibernate抛出TransientObjectException,消息为“对象引用未保存的临时实例-在刷新之前保存实例:标记”。查询如下: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
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
谢谢你的回答。我认为这是支持的,因为我在这里看到了这样一个例子,所以我猜他的例子也不起作用。