问题描述
我知道这已经被问过很多次了,但到目前为止没有一个答案解决了这个问题。
我的代码多年来一直运行良好,直到我从 Hibernate 4.3.11 升级到 Hibernate 5.2.0。现在我收到以下错误:
java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: User is not mapped [select password,salt from User where userName=:fullName and distributor_id is null]
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:131)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:155)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:162)
at org.hibernate.internal.AbstractSharedSessionContract.createquery(AbstractSharedSessionContract.java:633)
at org.hibernate.internal.AbstractSharedSessionContract.createquery(AbstractSharedSessionContract.java:101)
at com.stuhrling.service.authentication.AuthenticationService.authenticate(AuthenticationService.java:103)
at com.stuhrling.service.authentication.AuthenticationService.processLogin(AuthenticationService.java:42)
at com.stuhrling.interceptor.AuthenticationInterceptor.intercept(AuthenticationInterceptor.java:60)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
at com.stuhrling.interceptor.OpenSessionInViewInterceptor.intercept(OpenSessionInViewInterceptor.java:189)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
at com.stuhrling.interceptor.SessionMessageInterceptor.intercept(SessionMessageInterceptor.java:55)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
at org.apache.struts2.dispatcher.dispatcher.serviceAction(dispatcher.java:575)
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:81)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:957)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)
at org.apache.coyote.ajp.AjpAprProcessor.process(AjpAprProcessor.java:188)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2476)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2465)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: User is not mapped [select password,salt from User where userName=:fullName and distributor_id is null]
at org.hibernate.hql.internal.ast.QuerySyntaxException.generateQueryException(QuerySyntaxException.java:79)
at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:103)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:218)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:142)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:115)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:152)
at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:523)
at org.hibernate.internal.AbstractSharedSessionContract.createquery(AbstractSharedSessionContract.java:625)
... 31 more
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: User is not mapped
at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClasspersister(SessionFactoryHelper.java:171)
at org.hibernate.hql.internal.ast.tree.fromElementFactory.addfromElement(fromElementFactory.java:91)
at org.hibernate.hql.internal.ast.tree.FromClause.addfromElement(FromClause.java:79)
at org.hibernate.hql.internal.ast.HqlsqlWalker.createfromElement(HqlsqlWalker.java:321)
at org.hibernate.hql.internal.antlr.HqlsqlbaseWalker.fromElement(HqlsqlbaseWalker.java:3704)
at org.hibernate.hql.internal.antlr.HqlsqlbaseWalker.fromElementList(HqlsqlbaseWalker.java:3593)
at org.hibernate.hql.internal.antlr.HqlsqlbaseWalker.fromClause(HqlsqlbaseWalker.java:718)
at org.hibernate.hql.internal.antlr.HqlsqlbaseWalker.query(HqlsqlbaseWalker.java:574)
at org.hibernate.hql.internal.antlr.HqlsqlbaseWalker.selectStatement(HqlsqlbaseWalker.java:311)
at org.hibernate.hql.internal.antlr.HqlsqlbaseWalker.statement(HqlsqlbaseWalker.java:259)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:262)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:190)
... 37 more
大多数答案是应该查询实体,而不是表,我确实这样做了。
User 类的代码:
package com.stuhrling.domain.user;
import com.stuhrling.domain.customerservice.ProcessingLocation;
import com.stuhrling.domain.distributor.distributor;
import com.stuhrling.domain.favorites.FavoritesItem;
import com.stuhrling.domain.offer.Customer;
import com.stuhrling.domain.offer.Offer;
import com.stuhrling.domain.permissions.Group;
import com.stuhrling.domain.permissions.Permission;
import com.stuhrling.domain.permissions.PermissionList;
import com.stuhrling.domain.permissions.PermissionsSchema;
import com.stuhrling.domain.shoppingcart.ShoppingCartItem;
import com.stuhrling.persistence.HibernateUtil;
import com.stuhrling.persistence.PersistenceException;
import com.stuhrling.util.EqualsUtil;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.MapKey;
import javax.persistence.MapKeyColumn;
import javax.persistence.OnetoMany;
import javax.persistence.OrderBy;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.persistence.UniqueConstraint;
import org.apache.log4j.Logger;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.IndexColumn;
import org.jdom2.JDOMException;
@Entity
@Table(name = "USER",uniqueConstraints = {
@UniqueConstraint(columnNames = {"user_name"})})
public class User {
private static final int MAX_MRU_SIZE = 10;
private static final Logger log = Logger.getLogger(User.class);
public final static String ADMIN = "ADMIN";
public final static String GENERAL = "GENERAL";
public final static String disTRIBUTOR = "disTRIBUTOR";
public final static String MANUFACTURING = "MANUFACTURING";
public final static String PRODUCT_DEVELOPMENT = PRODUCT_DEVELOPMENT";
public final static String PHOTOGRAPHY = "PHOTOGRAPHY";
public static final String ACCOUNT_MANAGER = "ACCOUNT_MANAGER";
public static final String ADMINISTRATOR = "ADMINISTRATOR";
public static final String CUSTOMER_SERVICE = "CUSTOMER_SERVICE";
public static final String GENERAL_ACCESS = "GENERAL_ACCESS";
public static final String PRODUCT_AUTHOR = "PRODUCT_AUTHOR";
public static final String SHIPPING_RECEIVING = "SHIPPING_RECEIVING";
public static final String supplier = "supplier";
@Column(name = "calendar_email_subscribe")
private Boolean calendarEmailSubscribe;
@Column(name = "must_reset_password")
private Boolean mustResetPassword;
@Transient
private String xmlFile = "permissions.xml";
@SuppressWarnings("unused")
@Column(name = "salt")
private String salt;
@Column(name = "permission_snapshot")
private boolean permissionCompanySnapshot = false;
@Column(name = "permission_distributor_file_upload")
private boolean permissiondistributorFileUpload = false;
public boolean isPermissiondistributorFileUpload() {
return permissiondistributorFileUpload;
}
public void setPermissiondistributorFileUlpoad(boolean permissiondistributorFileUlpoad) {
this.permissiondistributorFileUpload = permissiondistributorFileUlpoad;
}
@Column(name = "full_name")
private String fullName;
@Column(name = "session_brand_mode")
private String sessionBrandMode;
@Column(name = "is_admin")
private boolean admin = false;
@Column(name = "exec_admin")
private boolean execAdmin = false;
@Column(name = "snap_shot_preferance",nullable = false,columnDeFinition = "varchar(255) default 'false|5|0|1|0|0|5|0|1'")
private String snapShotPreferance = "false|5|0|1|0|0|5|0|1"; /
@OnetoMany
@MapKeyColumn(name = "brand")
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE})
Map<String,PermissionList> brAndPermissions = new HashMap<String,PermissionList>();
@Column(name = "password")
private String password;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Column(name = "user_name")
private String userName;
@Column
private boolean archived = false;
@ManyToOne
@JoinColumn(name = "distributor_id",nullable = true)
private distributor distributor;
@Column(name = "user_type")
private String userType;
@Column(name = "email")
private String email;
@OnetoMany(mappedBy = "user",cascade = CascadeType.ALL)
@OrderBy("brand asc")
List<ShoppingCartItem> cart = new ArrayList<ShoppingCartItem>();
@OnetoMany(mappedBy = "user",cascade = CascadeType.ALL)
List<FavoritesItem> favorites = new ArrayList<FavoritesItem>();
@OnetoMany
@MapKey(name = "id")
@JoinTable(name = "USER_OFFERS",joinColumns = {
@JoinColumn(name = "user_id")},inverseJoinColumns = {
@JoinColumn(name = "offer_id")})
Map<Integer,Offer> userLists = new HashMap<Integer,Offer>();
@OnetoMany
@IndexColumn(name = "idx")
@JoinTable(name = "USER_MRU_OFFERS",inverseJoinColumns = {
@JoinColumn(name = "offer_id")})
List<Offer> mostRecentlyUsedLists = new LinkedList<Offer>();
@ManyToMany(mappedBy = "accountManagers")
private Set<Customer> accounts = new TreeSet<Customer>();
@Column(name = "vendor")
private String vendor;
@Column(name = "brand")
private String brand;
@Column(name = "permission_edit")
private boolean permissionToEdit;
@Column(name = "role")
private String role;
@Column(name = "last_login")
private Date lastLogin;
public String getXmlFile() {
return xmlFile;
}
public void setXmlFile(String xmlFile) {
this.xmlFile = xmlFile;
}
public boolean isPermissionCompanySnapshot() {
return permissionCompanySnapshot;
}
public void setPermissionCompanySnapshot(boolean permissionCompanySnapshot) {
this.permissionCompanySnapshot = permissionCompanySnapshot;
}
public String getSnapShotPreferance() {
return snapShotPreferance;
}
public void setSnapShotPreferance(String snapShotPreferance) {
this.snapShotPreferance = snapShotPreferance;
}
public boolean isExecAdmin() {
return execAdmin;
}
public void setExecAdmin(boolean execAdmin) {
this.execAdmin = execAdmin;
}
public boolean isAdmin() {
return admin;
}
public void setAdmin(boolean admin) {
this.admin = admin;
}
public String getSessionBrandMode() {
return sessionBrandMode;
}
public void setSessionBrandMode(String sessionBrandMode) {
this.sessionBrandMode = sessionBrandMode;
}
public boolean isArchived() {
return archived;
}
public void archiveUser() {
this.archived = true;
}
public void unarchiveUser() {
this.archived = false;
}
public String getUserType() {
return userType;
}
public void setUserType(String userType) {
this.userType = userType;
}
public List<FavoritesItem> getFavorites() {
return favorites;
}
public void setFavorites(List<FavoritesItem> favorites) {
this.favorites = favorites;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
verifyAndResetBrandMode();
}
public List<Offer> getUserLists() {
List<Offer> list = new ArrayList<Offer>();
list.addAll(userLists.values());
return list;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getId() {
return id;
}
public String getFullName() {
return fullName;
}
public String getpassword() {
return password;
}
public int getUserId() {
return id;
}
public String getUserName() {
return userName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public void setPassword(String password) {
this.password = password;
}
public void setUserId(int userId) {
this.id = userId;
}
public void setUserName(String userName) {
this.userName = userName;
}
public void setSalt(String salt) {
this.salt = salt;
}
public Offer getUserList(int id) {
Offer list = userLists.get(id);
addToMostRecentlyUsedLists(list);
return list;
}
public Map<Integer,Offer> getAllUserLists() {
return userLists;
}
public void removeList(Offer offer) {
userLists.remove(offer.getId());
}
public void addToMostRecentlyUsedLists(Offer list) {
if (list == null) {
return;
}
mostRecentlyUsedLists.remove(list);
mostRecentlyUsedLists.add(0,list);
while (mostRecentlyUsedLists.size() > MAX_MRU_SIZE) {
mostRecentlyUsedLists.remove(mostRecentlyUsedLists.size() - 1);
}
}
public List<Offer> getRecentlyUsedLists() {
return mostRecentlyUsedLists;
}
public boolean getPermissionToEdit() {
return permissionToEdit;
}
public void setPermissionToEdit(boolean permissionToEdit) {
this.permissionToEdit = permissionToEdit;
}
public String getRole() {
return role;
}
public boolean isRole(String r) {
return role != null && role.contains(r);
}
public void setRole(String role) {
this.role = role;
}
public void setLastLogin(Date date) {
this.lastLogin = date;
}
public Date getLastLogin() {
return lastLogin;
}
public String getvendor() {
return vendor;
}
public void setvendor(String vendor) {
this.vendor = vendor;
}
public boolean isRestrictedvendor() {
return (this.vendor != null && !this.vendor.equals(""));
}
public Set<Customer> getAccounts() {
return accounts;
}
public void setAccounts(Set<Customer> accounts) {
this.accounts = accounts;
}
@Override
public String toString() {
return this.fullName;
}
public Boolean getCalendarEmailSubscribe() {
return calendarEmailSubscribe;
}
public void setCalendarEmailSubscribe(Boolean calendarEmailSubscribe) {
this.calendarEmailSubscribe = calendarEmailSubscribe;
}
public distributor getdistributor() {
return distributor;
}
public void setdistributor(distributor distributor) {
this.distributor = distributor;
}
public boolean isdistributor() {
return this.distributor != null;
}
public boolean isPermissioned(String brand,String permission) {
boolean hasPermission = false;
if (brAndPermissions.containsKey(brand)) {
PermissionList permissionList = brAndPermissions.get(brand);
hasPermission = permissionList.hasPermission(permission);
}
return hasPermission;
}
@Transient
private boolean isGroupPermissioned = false;
public boolean isGroupPermissioned(String brand,String group) throws JDOMException,IOException {
loopThroughGroups(brand,group);
return isGroupPermissioned;
}
private void loopThroughGroups(String brand,IOException {
PermissionsSchema permissions = PermissionsSchema.getInstance("permissions.xml");
List<Group> groups = permissions.getGroups();
for (Group groupObj : groups) {
if (groupObj.getName().equals(group)) {
isGroupPermissioned = true;
loopThroughPermissions(brand,group,groupObj);
}
}
}
private void loopThroughPermissions(String brand,String group,Group groupObj) {
for (Permission permission : groupObj.getPermissions()) {
if (!(isPermissioned(brand,permission.getName()))) {
isGroupPermissioned = false;
break;
}
}
}
public List<ShoppingCartItem> getCart() {
return cart;
}
public void setCart(List<ShoppingCartItem> cart) {
this.cart = cart;
}
public void addPermission(String brand,String permission) {
if (brAndPermissions.containsKey(brand)) {
addPermissionToExistingValue(brand,permission);
} else {
addNewKeyAndValue(brand,permission);
}
}
private void addPermissionToExistingValue(String brand,String permission) {
PermissionList permissionList = brAndPermissions.get(brand);
permissionList.addPermission(permission);
}
private void addNewKeyAndValue(String brand,String permission) {
PermissionList permissionList = new PermissionList();
permissionList.addPermission(permission);
brAndPermissions.put(brand,permissionList);
}
public void removePermission(String brand,String permission) {
if (brAndPermissions.containsKey(brand)) {
PermissionList permissionList = brAndPermissions.get(brand);
permissionList.removePermission(permission);
}
}
public List<String> getPermissions(String brand) {
List<String> permissionArrayList = null;
if (brAndPermissions.get(brand) != null) {
PermissionList permissionList = brAndPermissions.get(brand);
permissionArrayList = permissionList.getPermissions();
}
return permissionArrayList;
}
public boolean isActionPermissioned(String brand,String action) throws IOException,JDOMException {
boolean isActionPermissioned = false;
PermissionsSchema schema = PermissionsSchema.getInstance("permissions.xml");
List<Permission> permissions = schema.getPermissionsHavingAction(action);
for (Permission permission : permissions) {
if (isPermissioned(brand,permission.getName())) {
isActionPermissioned = true;
break;
}
}
return isActionPermissioned;
}
public boolean hasPermissionInGroup(String brand,IOException {
boolean hasPermissionInGroup = false;
PermissionsSchema permissions = PermissionsSchema.getInstance(xmlFile);
List<Group> groups = permissions.getGroups();
for (Group groupObj : groups) {
if (groupObj.getName().equals(group)) {
List<Permission> permissionObjects = groupObj.getPermissions();
for (Permission element : permissionObjects) {
if (isPermissioned(brand,element.getName())) {
hasPermissionInGroup = true;
break;
}
}
break;
}
}
return hasPermissionInGroup;
}
public boolean isPermissionedForBrand(String brandtocheck) {
if (brand == null) {
return false;
}
return brand.contains(brandtocheck);
}
public void verifyAndResetBrandMode() {
if (sessionBrandMode == null || !isPermissionedForBrand(sessionBrandMode)) {
if (brand != null && !brand.isEmpty()) {
sessionBrandMode = brand.substring(0,1);
}
}
}
public void setMustResetPassword(boolean mustResetPassword) {
this.mustResetPassword = mustResetPassword;
}
public Map<String,PermissionList> getBrAndPermissions() {
return brAndPermissions;
}
public void setBrAndPermissions(Map<String,PermissionList> brAndPermissions) {
this.brAndPermissions = brAndPermissions;
}
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "USER_PROCESSING_LOCATION",joinColumns = { @JoinColumn(name = "user_id") },inverseJoinColumns = { @JoinColumn(name = "processing_location_id") })
private final List<ProcessingLocation> processingLocations = new ArrayList<ProcessingLocation>();
public List<ProcessingLocation> getProcessingLocations() {
return processingLocations;
}
public void addProcessingLocation(ProcessingLocation processingLocation) {
processingLocations.add(processingLocation);
}
public static void main(String[] args) throws PersistenceException {
HibernateUtil.getCurrentSession();
}
}
用户的实体映射,为简洁起见省略其他实体:
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.MysqL.cj.jdbc.Driver</property>
<property name="hibernate.connection.useUnicode">true</property>
<property name="hibernate.connection.characterEncoding">UTF-8</property>
<!-- Connection Pool Setting -->
<property name="hibernate.c3p0.min_size">0</property>
<property name="hibernate.c3p0.max_size">30</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">90</property>
<property name="hibernate.c3p0.unreturnedConnectionTimeout">2700</property>
<property name="hibernate.c3p0.debugUnreturnedConnectionStackTraces">true</property>
<property name="hibernate.c3p0.testConnectionOnCheckout">true</property>
<property name="hibernate.c3p0.preferredTestQuery">SELECT 1</property>
<!-- sql dialect -->
<property name="dialect">org.hibernate.dialect.MysqL5Dialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>
<!-- Echo all executed sql to stdout -->
<property name="show_sql">false</property>
<!-- Drop and re-create the database schema on startup -->
<!-- <property name="hbm2ddl.auto">none</property>-->
<mapping class="com.stuhrling.domain.user.User"/>
</session-factory>
</hibernate-configuration>
private List<Object[]> getUserRecords(login){
Session session = HibernateUtil.getCurrentSession();
Query hql = session.createquery("select password,salt from User where userName=:fullName");
hql.setString("fullName",login);
List<Object[]> results = hql.list();
if (results.size() > 1) {
throw new ServiceException("Database inconsistent two users with the same user name");
}
return results;
}
有人有什么想法吗?我很绝望,我的工作几乎停滞了......
任何帮助将不胜感激!
更新: 在这里,我按照要求发布了 HibernateUtil 类:
package com.stuhrling.persistence;
import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import com.stuhrling.config.AppConfig;
public class HibernateUtil {
static Logger log = Logger.getLogger(HibernateUtil.class);
private static SessionFactory sessionFactory;
private static final ThreadLocal<Session> threadSession = new ThreadLocal<>();
static {
try {
Class.forName("com.MysqL.cj.jdbc.Driver");
final Configuration configuration = new Configuration();
configuration.configure();
AppConfig appConfig = AppConfig.getInstance();
configuration.setProperty("hibernate.connection.url",appConfig.getProperty("db.url"));
configuration.setProperty("hibernate.connection.username",appConfig.getProperty("db.username"));
configuration.setProperty("hibernate.connection.password",appConfig.getProperty("db.password"));
final StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.configure()
.build();
configuration.buildSessionFactory(serviceRegistry);
sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory();
} catch (Throwable e) {
log.error("Unable to setup DB Connection",e);
}
}
public static void closeSession() {
try {
final Session s = threadSession.get();
if ((s != null) && s.isopen()) {
s.close();
}
} catch (final HibernateException ex) {
log.error("Unable to close current session",ex);
} finally {
threadSession.set(null);
}
}
public static Session getCurrentSession() throws PersistenceException {
Session s = threadSession.get();
try {
if (s == null) {
s = sessionFactory.openSession();
threadSession.set(s);
}
}
catch (final HibernateException ex) {
throw new PersistenceException("Unable to get current session",ex);
}
return s;
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static void commitTransaction() {
threadSession.get().getTransaction().commit();
threadSession.get().beginTransaction();
}
}
解决方法
由于某种原因,您注册的实体未被选中。也许您正在使用使用不同配置文件的 Session/SessionFactory?
,'User' 是 mysql 中的一个保留字,也许这就是原因?
,实体 您可以在代码中更改两件事
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
所有生成的 ID 更改为:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
HibernateUtil 应用以下更改
Metadata metadata = new MetadataSources(serviceRegistry).getMetadataBuilder().build();
return metadata.getSessionFactoryBuilder().build();
,
hibernate 5 版本改变了命名策略。所以我认为查询中的 'User' 不再匹配数据库中的 'User' 类和 'USER' 表。
我建议您更改查询以使用数据库中的实际表名。
根据@Table注解,查询应如下所示:
"select password,salt from USER where userName=:fullName"
如果 'USER' 是实际的表名。