MappingException未知实体

时间:2017-07-28 22:16:24

标签: java hibernate hibernate-mapping

出于某种原因,当我使用save方法时,我得到了一个Mapping Exception。我将映射标记放在Hibernate.cfg.xml文件中,并将相应的类标记为实体。

理论上,它应该在驱动程序中调用后将新用户添加到我的数据库中(用于测试ORM)

File System and ExceptionLocation

[hibernate.cfg.xml中]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
    <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
    <property name="hibernate.connection.password">password</property>
    <property name="hibernate.connection.url">jdbc:oracle:thin:@atomicity.ciwxju2fmzjg.us-east-2.rds.amazonaws.com:1521:ORCL</property>
    <property name="hibernate.connection.username">Master</property>
    <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
    <mapping class="domain.Users" />
    <mapping class="domain.ProfilePics" />
    <mapping class="domain.Topics" />
    <mapping class="domain.Posts" />
</session-factory>

[Users.java]

package domain;

import javax.persistence.*;

@NamedQueries({ @NamedQuery(name = "getAllUsers", query = "FROM Users"),
    @NamedQuery(name = "getUsersByUsername", query = "FROM Users user WHERE user.username = :var") })
@Entity
@Table(name = "A_USERS")
public class Users {

    public Users() {
        super();
    }

    public Users(String username, String email, String password, String firstName, String lastName, boolean blocked) {
        super();
        this.username = username;
        this.email = email;
        this.password = password;
        this.firstName = firstName;
        this.lastName = lastName;
        this.blocked = blocked;
    }

    @Id
    @Column(name = "U_USERNAME")
    private String username;
    @Column(name = "U_EMAIL")
    private String email;
    @Column(name = "U_PASSWORD")
    private String password;
    @Column(name = "U_FIRSTNAME")
    private String firstName;
    @Column(name = "U_LASTNAME")
    private String lastName;
    @Column(name = "BLOCKED")
    private boolean blocked;

    public String getUsername() {
        return username;
    }

    public Users setUsername(String username) {
        this.username = username;
        return this;
    }

    public String getFirstName() {
        return firstName;
    }

    public Users setFirstName(String firstName) {
        this.firstName = firstName;
        return this;
    }

    public String getLastName() {
        return lastName;
    }

    public Users setLastName(String lastName) {
        this.lastName = lastName;
        return this;
    }

    public boolean isBlocked() {
        return blocked;
    }

    public Users setBlocked(boolean blocked) {
        this.blocked = blocked;
        return this;
    }

    public String getPassword() {
        return password;
    }

    public Users setPassword(String password) {
        this.password = password;
        return this;
    }

    public String getEmail() {
        return email;
    }

    public Users setEmail(String email) {
        this.email = email;
        return this;
    }
}

[UsersDAOImpl.java]

package dao;

import static org.junit.Assert.*;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import customExceptions.*;
import util.Debug;
import util.HibernateUtil;
import domain.Users;

@Transactional
public class UsersDAOImpl implements UsersDAO {

@Autowired
private SessionFactory sessionFactory;

public void setSessionFactory(SessionFactory sessionfactory) {
    this.sessionFactory = sessionfactory;
}

@Test
public void testPush() {
    try {
        push(new Users("username6", "email@gmail.com", "password", "firstName", "lastName", false));
    } catch (UserNameTakenException e) {
        e.printStackTrace();
        fail();
    } catch (InvalidNameException e) {
        e.printStackTrace();
        fail();
    } catch (Exception e) {
        e.printStackTrace();
        System.out.println(e.getMessage());
        fail();
    }
}

/**
 * Adds a new user to the database
 * 
 * @param newUser
 *            The user to be added
 * @throws UserNameTakenException
 *             In the case a username is taken
 * @throws InvalidNameException
 *             If a field is left blank, but front end should prevent that
 */
@Override
@Transactional(propagation = Propagation.REQUIRED)
public void push(Users newUser) throws UserNameTakenException, InvalidNameException {
    // For debugging purposes:
    Debug.printMessage(this.getClass(), "push()", "invoked");
    // Check if there are any empty Strings
    if (newUser.getUsername().isEmpty() || newUser.getPassword().isEmpty() || newUser.getFirstName().isEmpty()
            || newUser.getLastName().isEmpty()) {
        throw new InvalidNameException("There is an empty String");
    }
    // Get the session
    Session sess = sessionFactory.getCurrentSession();
    // Check to see if the username is taken
    Users users = getUserByName(newUser.getUsername());
    // If the list is not empty, a user with the name was found
    if (users != null) {
        sess.close();
        throw new UserNameTakenException("The username was found in the database");
    } else {
        // Otherwise, add the new user
        // Debug
        Debug.printMessage(this.getClass(), "push()", "username available.");
        Debug.printErrorMessage(this.getClass(), "push()", "saving " + newUser.getUsername());
        sess.save(newUser);
        sess.close();
    }

}

/**
 * Updates the User's password in the database
 * 
 * @param user
 *            The user to change
 * @param newVal
 *            The new password
 */
@Override
public void updatePassword(Users user, String newVal) {
    Debug.printMessage(this.getClass(), "updatePassword()", "invoked");
    Session sess = HibernateUtil.getSession();
    Transaction trans = sess.beginTransaction();
    user.setPassword(newVal);
    sess.update(user);
    trans.commit();
    sess.close();
}

/**
 * Updates the User's first name in the database
 * 
 * @param user
 *            The user to change
 * @param newVal
 *            The new first name
 */
@Override
public void updateFirstName(Users user, String newVal) {
    // For debugging purposes:
    Debug.printMessage(this.getClass(), "updateFirstName()", "invoked");
    Session sess = HibernateUtil.getSession();
    Transaction trans = sess.beginTransaction();
    user.setFirstName(newVal);
    sess.update(user);
    trans.commit();
    sess.close();
}

/**
 * Updates the User's last name in the database
 * 
 * @param user
 *            The user to change
 * @param newVal
 *            The new last name
 */
@Override
public void updateLastName(Users user, String newVal) {
    // For debugging purposes:
    Debug.printMessage(this.getClass(), "updateLastName()", "invoked");
    Session sess = HibernateUtil.getSession();
    Transaction trans = sess.beginTransaction();
    user.setLastName(newVal);
    sess.update(user);
    trans.commit();
    sess.close();
}

/**
 * Returns the user with the given username
 * 
 * @param username
 *            The username to find
 */
@Override
public Users getUserByName(String username) {
    // For debugging purposes:
    Debug.printMessage(this.getClass(), "getUserByName()", "invoked");
    Session sess = HibernateUtil.getSession();
    Users user = (Users) sess.get(Users.class, username);
    sess.close();
    return user;
}

/**
 * Returns a list of all users from A_USERS
 */
@Override
public List<Users> getAllUsers() {
    // For debugging purposes:
    Debug.printMessage(this.getClass(), "getAllUsers()", "invoked");
    Session sess = HibernateUtil.getSession();
    Query query = sess.getNamedQuery("getAllUsers");
    List<Users> users = query.list();
    sess.close();
    return users;
}
}

[Driver.java]

package testDrivers;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import customExceptions.InvalidNameException;
import customExceptions.UserNameTakenException;
import dao.UsersDAO;
import domain.Users;

public class Driver {

    public static void main(String args[]) {
        ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
        UsersDAO dao = (UsersDAO) ac.getBean("usersDAO");

        try {
            dao.push(new Users("username6", "email@gmail.com", "password", "firstName", "lastName", false));
        } catch (UserNameTakenException e) {
            System.out.println("Username taken");
            e.printStackTrace();
        } catch (InvalidNameException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        ((AbstractApplicationContext) ac).close();
    }
}

堆栈跟踪

Exception in thread "main" org.hibernate.MappingException: Unknown entity: domain.Users
at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:1096)
at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1443)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:116)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:209)
at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:194)
at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:715)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:707)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:702)
at dao.UsersDAOImpl.push(UsersDAOImpl.java:78)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:302)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208)
at com.sun.proxy.$Proxy14.push(Unknown Source)
at testDrivers.Driver.main(Driver.java:18)

您可以忽略testPush方法,因为它在导致其他错误后不会被使用。

感谢任何帮助

1 个答案:

答案 0 :(得分:0)

尝试以另一种方式获取sessionFactory

    final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
            .configure() // configures settings from hibernate.cfg.xml
            .build();
    try {
        sessionFactory = new MetadataSources( registry ).buildMetadata().buildSessionFactory();
    }
    catch (Exception e) {
        StandardServiceRegistryBuilder.destroy( registry );
    }