У меня есть два проекта, один Maven-Dependancy другого. Оба имеют отдельные базы данных PostgreSQL. Если я запускаю приложение, выдается ошибка «Не сущность», как только я пытаюсь использовать сущность зависимого проекта в зависимом проекте.
Я уже пытался изменить тип транзакции на JTA или RESSOURCE-LOCAL, или вообще ничего.
Я также снова сгенерировал сущности из утилит, используя инструменты Eclipse JPA.
User.java:
/**
* The persistent class for the "Users" database table.
*
*/
@Entity
@Table(name = "\"Users\"")
@NamedQuery(name = "User.findAll", query = "SELECT u FROM User u")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
private Integer id;
private String mail;
private String password;
// bi-directional many-to-many association to Role
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "\"User_Role\"", joinColumns = { @JoinColumn(name = "user_id") }, inverseJoinColumns = {
@JoinColumn(name = "role_id") })
private Set<Role> roles;
// bi-directional many-to-many association to Permission
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "\"User_Permission\"", joinColumns = { @JoinColumn(name = "user_id") }, inverseJoinColumns = {
@JoinColumn(name = "permission_id") })
private Set<Permission> permissions;
public User() {
}
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public String getMail() {
return this.mail;
}
public void setMail(String mail) {
this.mail = mail;
}
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
public Set<Permission> getPermissions() {
return this.permissions;
}
public void setPermissions(Set<Permission> permissions) {
this.permissions = permissions;
}
public Set<Role> getRoles() {
return this.roles;
}
public void setRoles(Set<Role> roles) {
this.roles = roles;
}
}
persistence.xml:
<persistence-unit name="Authentication" transaction-type="JTA">
<class>com.auticon.learning.authentication.entities.User</class>
<class>com.auticon.learning.authentication.entities.Permission</class>
<class>com.auticon.learning.authentication.entities.Role</class>
<properties>
<!-- EclipseLink should create the database schema automatically -->
<property name="eclipselink.ddl-generation" value="create-tables" />
<property name="eclipselink.ddl-generation.output-mode"
value="database" />
<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"></property>
<property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/Credentials"></property>
<property name="javax.persistence.jdbc.user" value="postgres"></property>
<property name="javax.persistence.jdbc.password" value="******"></property>
</properties>
</persistence-unit>
Класс, в котором выдается ошибка:
public static User findUser(String username) {
CriteriaBuilder builder = SessionConfig.getSession().getCriteriaBuilder();
CriteriaQuery<User> criteriaQuery = builder.createQuery(User.class);
//Error is thrown when I try to get the Root Parameter of the Entity
Root<User> root = criteriaQuery.from(User.class);
criteriaQuery.where(builder.equal(root.get(User_.MAIL), username));
Query<User> query = SessionConfig.getSession().createQuery(criteriaQuery);
try {
return query.getSingleResult();
} catch (NoResultException e) {
return null;
}
}
Вызов класса в другом проекте, который зависит от вышеупомянутого проекта (да, в основном простой из Primefaces Showcase: P):
public void login() {
FacesMessage message = null;
boolean loggedIn = false;
//Login.checkPW() first action is calling findUser()
if (Login.checkPW(username, password)) {
loggedIn = true;
message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Welcome", username);
} else {
loggedIn = false;
message = new FacesMessage(FacesMessage.SEVERITY_WARN, "Loggin Error", "Invalid credentials");
}
FacesContext.getCurrentInstance().addMessage(null, message);
PrimeFaces.current().ajax().addCallbackParam("loggedIn", loggedIn);
}
Экран БД PostgreSQL
(Я не могу публиковать изображения в посте напрямую)
JPA, понимая, что я правильно аннотировал сущность, перечислил ее в файле persitence.xml, и таблица ДЕЙСТВИТЕЛЬНО существует в БД.
Полная трассировка стека:
Вызвано: java.lang.IllegalArgumentException: Не является сущностью: класс com.auticon.learning.authentication.entities.User
в org.hibernate.metamodel.internal.MetamodelImpl.entity (MetamodelImpl.java:536)
в org.hibernate.query.criteria.internal.QueryStructure.from (QueryStructure.java:126)
в org.hibernate.query.criteria.internal.CriteriaQueryImpl.from (CriteriaQueryImpl.java:153)
в com.auticon.learning.authentication.client.DBOperations.findUser (DBOperations.java:22)
на com.auticon.learning.authentication.api.Login.checkPW (Login.java:9)
в de.auticon.views.UserLoginView.login (UserLoginView.java:43)
at sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод)
at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
в java.lang.reflect.Method.invoke (Method.java:498)
в com.sun.el.util.ReflectionUtil.invokeMethod (ReflectionUtil.java:181)
на com.sun.el.parser.AstValue.invoke (AstValue.java:289)
в com.sun.el.MethodExpressionImpl.invoke (MethodExpressionImpl.java:304)
в org.jboss.weld.module.web.util.el.ForwardingMethodExpression.invoke (ForwardingMethodExpression.java:40)
в org.jboss.weld.module.web.el.WeldMethodExpression.invoke (WeldMethodExpression.java:50)
в org.jboss.weld.module.web.util.el.ForwardingMethodExpression.invoke (ForwardingMethodExpression.java:40)
в org.jboss.weld.module.web.el.WeldMethodExpression.invoke (WeldMethodExpression.java:50)
на com.sun.faces.facelets.el.TagMethodExpression.invoke (TagMethodExpression.java:65)
в com.sun.faces.application.MethodBindingMethodExpressionAdapter.invoke (MethodBindingMethodExpressionAdapter.java:66)
... еще 58