我看过这里无数的帖子,似乎没有一个能解决我的问题。我有一个带有Hibernate
和JUnit
的企业Java应用程序,但这似乎更像是一个测试环境问题。多个开发人员在Eclipse的本地系统上分别遇到此问题。在远程Tomcat
服务器上,一切都运行良好。
我添加了 4个新实体,所有人都遇到了同样的问题所以我会专注于1.我绝对排除了拼写错误,没有将实体添加到persistence.xml
和JPA验证。它在Eclipse
中验证并完美编译等。
注意:
我尝试了NAMED QUERY和NATIVE QUERY,但都没有工作。 Native Query会引发org.hibernate.MappingException: Unknown entity: com.xx.xx.db.entity.Dog
异常。命名查询将引发org.hibernate.MappingException: Named query not known: Dog.findByDogName
我们不使用hibernate-cfg.xml
或那种性质的东西。我们使用persistence.xml,我的代码片段附在下面。
CentOS 5.9
上运行Eclipse Kepler和Eclipse Juno。测试框架是JUnit 实体:
package com.xx.xx.db.entity;
import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import java.util.*;
import javax.persistence.*;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Type;
import com.xx.xx.db.dbenums.*;
import com.xx.xx.db.helper.*;
import com.xx.xx.db.dao.DaoHelper;
@Entity
@Table(name = "DOG")
@NamedQueries({
@NamedQuery(name = "Dog.findAll", query = "SELECT a FROM Dog a"),
@NamedQuery(name = "Dog.findByDogName", query = "SELECT a FROM Dog a WHERE a.dogName = :dogName")
})
public class Dog implements Serializable
{
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@Column(name = "DOG_ID", length = 16)
private Long dogId;
@Basic(optional = false)
@Column(name = "DOG_NAME", length = 16)
private String dogName;
public Dog()
{
super();
}
public Dog(Long dogId)
{
this.dogId = dogId;
}
public Dog(Long dogId, String dogName)
{
this.dogId = dogId;
this.dogName = dogName;
}
public Long getdogId()
{
return dogId;
}
public void setdogId(Long dogId)
{
this.dogId = dogId;
}
public String getdogName()
{
return dogName;
}
public void setdogName(String dogName)
{
this.dogName = dogName;
}
}
DAO:
public Dog findByDogName(String dogName)
{
try
{
dogName = dogName.toUpperCase();
Query query = entityManager.createNamedQuery("Dog.findByDogName");
query.setParameter("dogName", dogName);
List<Dog> mcList = query.getResultList();
if (mcList != null && mcList.size() > 0)
{
return mcList.get(0);
}
_log.debug("dog match not found");
return null;
} catch (Exception e)
{
return null;
}
}
来自persistence.xml的片段:
<class>com.xx.xx.db.entity.xxxxxxxxxxx</class>
<class>com.xx.xx.db.entity.xxxxxxxxxxxxx</class>
<class>com.xx.xx.db.entity.Dog</class>
答案 0 :(得分:0)
原来我们的应用程序有多个persistence.xml文件(每个子项目1个),即使“Dog”实体位于使用Dogs的子项目的persistence.xml中(并且测试是正在运行),Maven无法处理。它首先从persistence.xml读取,没有列出Dog实体,我猜不能合并。
在我们的所有persistence.xml文件中添加新实体后,经过大量的挖掘后解决了这个问题。