双向休眠 - org.hibernate.AnnotationException: Unknown mappedBy in: error

Posted

技术标签:

【中文标题】双向休眠 - org.hibernate.AnnotationException: Unknown mappedBy in: error【英文标题】:bidirectional hibernate - org.hibernate.AnnotationException: Unknown mappedBy in: error 【发布时间】:2016-07-27 20:31:39 【问题描述】:

我有 4 个表 kode_pos、korwil、user 和 wafat。在 Korwil 类中,它持有用户的外键并将主键提供给 kode_pos, 这意味着在 korwil 类 @OneToOne 和 @OneToMany 中有 2 个映射,

我收到了这个错误

org.hibernate.AnnotationException: Unknown mappedBy in: org.ppbni.splatter.model.UserAdmin.korwil,引用属性未知:org.ppbni.splatter.model.Korwil.useradmin` 当我运行应用程序时~

这是erd,

这是我的 kode_pos 课程

package org.ppbni.splatter.model;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Entity;
import javax.persistence.MapsId;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import javax.persistence.ManyToOne;
import javax.persistence.CascadeType;

@SuppressWarnings("serial")
@Entity
@Table(name="kode_pos")
public class KodePos implements Serializable

    @Id
    @Column(name="kode_pos", unique=true, nullable=false)
    private String kode_pos;

    @Column(name="kelurahan")
    private String kelurahan;

    @Column(name="kecamatan")
    private String kecamatan;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="kode_korwil")
    private Korwil korwil;

    /**Setter and Getter Methods**/

这是我的 korwil 课,

package org.ppbni.splatter.model;

import java.io.Serializable;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.MapsId;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.CascadeType;

@SuppressWarnings("serial")
@Entity
@Table(name="korwil")
public class Korwil implements Serializable

    @Id
    @Column(name="kode_korwil", unique=true, nullable=false)
    private String kode_korwil;

    @Column(name="nama_korwil")
    private String nama_korwil;

    @Column(name="alias_jabatan")
    private String alias_jabatan;

    @Column(name="jabatan_korwil")
    private String jabatan_korwil;

    @OneToMany(fetch = FetchType.LAZY, mappedBy="korwil")
    private Set<KodePos> kodepos;

    @OneToOne
    @MapsId
    @JoinColumn(name="no_dana")
    private UserAdmin useradmin;

    /**Setter and Getter Methods**/


这是我的用户类,

package org.ppbni.splatter.model;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Entity;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.OneToOne;
import javax.persistence.CascadeType;

@SuppressWarnings("serial")
@Entity
@Table(name="user")
public class UserAdmin implements Serializable

    @Id
    @GeneratedValue
    @Column(name="no_dana", unique=true, nullable=false)
    private String no_dana;

    @Column(name="npp")
    private String npp;

    @Column(name="password")
    private String password;

    @OneToOne(mappedBy="useradmin", cascade=CascadeType.ALL)
    private Wafat wafat;

    @OneToOne(mappedBy="useradmin", cascade=CascadeType.ALL)
    private Korwil korwil;

    /**other field**//

    /**setter and gettter methods**/

这是我的wafat课,

package org.ppbni.splatter.model;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.MapsId;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@SuppressWarnings("serial")
@Entity
@Table(name="wafat")
public class Wafat implements Serializable

    @Id
    @Column(name="kode_wafat", unique=true, nullable=false)
    private String kode_wafat;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="tgl_wafat")
    private Date tgl_wafat;

    @Column(name="usia_wafat")
    private int usia_wafat;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="tgl_makam")
    private Date tgl_makam;

    @Column(name="tempat_makam")
    private String tempat_makam;

    @OneToOne
    @MapsId
    @JoinColumn(name="no_dana")
    private UserAdmin useradmin;

    /**Setter and Getter Methods**/

这是我的控制器,

@SuppressWarnings("deprecation")
@RequestMapping(value="/user/daftar-anggota-ppbni.html")
public ModelAndView userDaftarAnggotaPPBNI(ModelMap model, HttpServletRequest request, HttpServletResponse response)throws Exception

    SessionFactory factory = new Configuration().configure().buildSessionFactory();
    Session session = factory.openSession();

    String nama = request.getParameter("nama");
    String kota = request.getParameter("kota");

    System.out.println(nama);
    System.out.println(kota);

    Query query = session.createQuery("from UserAdmin where (nama_depan = :namadepan or nama_tengah = :namatengah or nama_belakang = :namabelakang) or kota = :kota");
    query.setParameter("namadepan", nama);
    query.setParameter("namatengah", nama);
    query.setParameter("namabelakang", nama);
    query.setParameter("kota", kota);
    System.out.println(query);

    @SuppressWarnings("unchecked")
    List <UserAdmin> result = query.list();

    for(int i=0; i < result.size(); i++)

        model.addObject("result", result);
    

    session.close();
    factory.close();

    return userDaftarAnggota(model);


这是错误,

org.hibernate.AnnotationException: Unknown mappedBy in: org.ppbni.splatter.model.UserAdmin.korwil,引用属性未知:org.ppbni.splatter.model.Korwil.useradmin 在 org.hibernate.cfg.OneToOneSecondPass.doSecondPass(OneToOneSecondPass.java:152) 在 org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1686) 在 org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1393) 在 org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1826) 在 org.ppbni.splatter.web.controller.UserController.userDaftarAnggotaPPBNI(UserController.java:97) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) 在 java.lang.reflect.Method.invoke(未知来源) 在 org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219) 在 org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) 在 org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745) 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686) 在 org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925) 在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936) 在 org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:647) 在 org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 在 com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129) 在 com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 在 org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118) 在 org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 在 org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 在 org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 在 org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 在 org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 在 org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 在 org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:150) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 在 org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:183) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 在 org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 在 org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 在 org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) 在 org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) 在 org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) 在 org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 在 org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) 在 java.lang.Thread.run(Unknown Source)

任何帮助都会很高兴:)

【问题讨论】:

你为什么使用“MapsId”? objectdb.com/api/java/jpa/MapsId 当你想映射一个 Embeddable 对象的 id 时使用它。 @GeneratedValue for private String no_dana;UserAdmin 看起来很奇怪。 【参考方案1】:

当 Hibernate 通过持久类生成数据库模式时发生异常。

我已经检查了您与 Hibernate 5 的映射 - 没有任何此类异常(当然,我不确定您代码的其他部分)。

我不知道你的 Hibernate 版本,看起来像 Hibernate 4。但无论如何,这部分代码会出现异常

    PersistentClass otherSide = (PersistentClass) persistentClasses.get( value.getReferencedEntityName() );
    Property otherSideProperty;
    try 
        if ( otherSide == null ) 
            throw new MappingException( "Unable to find entity: " + value.getReferencedEntityName() );
        
        otherSideProperty = BinderHelper.findPropertyByName( otherSide, mappedBy );
    
    catch (MappingException e) 
        throw new AnnotationException(
                "Unknown mappedBy in: " + StringHelper.qualify( ownerEntity, ownerProperty )
                        + ", referenced property unknown: "
                        + StringHelper.qualify( value.getReferencedEntityName(), mappedBy )
        );
    
    if ( otherSideProperty == null ) 
        throw new AnnotationException(
                "Unknown mappedBy in: " + StringHelper.qualify( ownerEntity, ownerProperty )
                        + ", referenced property unknown: "
                        + StringHelper.qualify( value.getReferencedEntityName(), mappedBy )
        );
    

抛出throw new MappingException( "Unable to find entity: " + value.getReferencedEntityName() )并抓住它是一个非常奇怪的逻辑。而且报错信息很混乱。

otherSide 是您的 KorwilotherSideProperty 是您的 Korwil.useradmin。 Hibernate 不将Korwil 视为一个实体。可能的原因:您没有将其添加到您的映射中,或者扫描包中的实体存在一些问题。你需要弄清楚为什么 Hibernate 将 UserAdmin 视为一个实体而 Korwil 不是。

【讨论】:

我正在使用休眠 3 :DD,这是休眠 3 的错误?? @splatter_fadli 不知道。尝试删除与UserAdmin 的关联。 Hibernate 是否认为Korwil 是持久的?您也可以尝试使用 Hibernate 4 或 Hibernate 5。 我找到了这个***.com/questions/22466050/…,是真的吗?? @splatter_fadli 我不确定,因为HHH-5695 中的一个示例在关系@Id @OneToOne @JoinColumn(name="BAR_ID") private Foo foo; 的所有者上有一个@Id 注释 我的映射在 hibernate 5 中没问题??当我运行我的控制器时显示的异常,当启动 tomcat 时它很好

以上是关于双向休眠 - org.hibernate.AnnotationException: Unknown mappedBy in: error的主要内容,如果未能解决你的问题,请参考以下文章

jpa休眠一对多双向[重复]

如何解决休眠双向映射导致的json序列化器中的循环引用?

从孩子保存时,休眠一对多双向连接会提供新的父母

双向休眠 - org.hibernate.AnnotationException: Unknown mappedBy in: error

休眠一对多关联删除

使用 AspectJ 编译器而不是 Javac 时编译时出错