【问题标题】:Hibernate with annotations: "Repeated column in mapping fo entity" - Composite PK带有注释的休眠:“实体映射中的重复列”-复合 PK
【发布时间】:2013-07-30 00:07:18
【问题描述】:

首先,我要感谢所有阅读本文的人。

我的应用程序中的 Hibernate 固件有问题。下图是导致错误的部分数据库示意图。


(来源:akamaihd.net

我的代码是由逆向工程自动生成的,为了使其正常工作,我必须向代码生成器“显示”module_application 表不是多对多表(使用自定义逆向工程策略)。现在,当我运行我的代码时,我收到以下错误:

Error creating Session: org.hibernate.MappingException: Repeated column in mapping for entity: DAL.module_application.ModuleApplication column: application_id (should be mapped with insert="false" update="false")

ModuleApplication类如下图:

@Entity
@Table(name = "module_application", catalog = "domotics")
public class ModuleApplication implements java.io.Serializable
{

    /**
     * 
     */
    private static final long serialVersionUID = 4725933797587110677L;
    private ModuleApplicationId id;
    private Application application;
    private Module module;
    private Set<ModuleApplicationStatus> moduleApplicationStatuses = new HashSet<ModuleApplicationStatus>(0);

    public ModuleApplication()
    {
    }

    public ModuleApplication(ModuleApplicationId id, Application application, Module module)
    {
        this.id = id;
        this.application = application;
        this.module = module;
    }

    public ModuleApplication(ModuleApplicationId id, Application application, Module module, Set<ModuleApplicationStatus> moduleApplicationStatuses)
    {
        this.id = id;
        this.application = application;
        this.module = module;
        this.moduleApplicationStatuses = moduleApplicationStatuses;
    }

    @EmbeddedId
    @AttributeOverrides(
    {
        @AttributeOverride(name = "networkAddress", column = @Column(name = "network_address", nullable = false, length = 45)),
        @AttributeOverride(name = "applicationId", column = @Column(name = "application_id", nullable = false)) 
    })
    public ModuleApplicationId getId()
    {
        return this.id;
    }

    public void setId(ModuleApplicationId id)
    {
        this.id = id;
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "application_id", nullable = false, insertable = false, updatable = false)
    public Application getApplication()
    {
        return this.application;
    }

    public void setApplication(Application application)
    {
        this.application = application;
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "network_address", nullable = false, insertable = false, updatable = false)
    public Module getModule()
    {
        return this.module;
    }

    public void setModule(Module module)
    {
        this.module = module;
    }

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "moduleApplication")
    public Set<ModuleApplicationStatus> getModuleApplicationStatuses()
    {
        return this.moduleApplicationStatuses;
    }

    public void setModuleApplicationStatuses(Set<ModuleApplicationStatus> moduleApplicationStatuses)
    {
        this.moduleApplicationStatuses = moduleApplicationStatuses;
    }
}

我们可以看到,insert 和 update 都设置为 false。如果有人知道此错误的确切原因和/或如何解决它,请分享知识!

【问题讨论】:

    标签: java hibernate annotations composite-primary-key


    【解决方案1】:

    我发现您可能在 [this post] (Hibernate Mapping Exception : Repeated column in mapping for entity) 中遇到了同样的问题。

    也许您可以使用代理键作为 id 或使用查询来检索应用程序。

    您现在使用的是对象图解决方案,或者您可以使用查询解决方案:

    仅将 Application 和 Module 的标识保留为 ModuleApplication 中的字段。您可以使用查询来检索给定 ModuleApplication 的 Application 或 Module

    public class ModuleApplication {
    
        private ModuleApplicationId id;
    
        private Set<ModuleApplicationStatus> moduleApplicationStatuses = new HashSet<ModuleApplicationStatus>(0);
    }
    
    Application application = applicationRepository.findBy(moduleApplication.getApplicationId());
    

    【讨论】:

    • 我试图不改变我的 ER 模型,我倾向于认为框架需要关注数据库模型,而不是相反。您能否详细解释一下“使用查询检索应用程序”的含义?
    • @GustavoSgarbiCampos 我同意你的看法,但有时必须做出妥协并更新答案。
    • 非常感谢您的帮助。我不太了解存储库解决方案,您能再解释一下吗?我尝试删除 getApplication 和 setApplication 方法以及“@ManyToOne”和“@JoinColumn”注释,但错误不断发生!
    • @GustavoSgarbiCampos 对不起,我的错。我误解了错误堆栈。查看更新的答案。
    猜你喜欢
    • 2014-10-20
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 2012-03-11
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多