2017-07-28 51 views
0

由於某些原因,當我使用save方法時,我得到一個Mapping Exception。我將映射標記放在Hibernate.cfg.xml文件中,並將相應的類標記爲實體。MappingException未知實體

理論上它應該被稱爲在驅動程序後添加一個新用戶到我的數據庫(它被用於測試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 protected]", "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 protected]", "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方法,因爲在不使用它之後它導致了一個不同的錯誤。

任何幫助表示讚賞

回答

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); 
    } 
相關問題