Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带注释的休眠:";映射fo实体中的重复列";-复合PK_Java_Hibernate_Annotations_Composite Primary Key - Fatal编程技术网

Java 带注释的休眠:";映射fo实体中的重复列";-复合PK

Java 带注释的休眠:";映射fo实体中的重复列";-复合PK,java,hibernate,annotations,composite-primary-key,Java,Hibernate,Annotations,Composite Primary Key,首先,我要感谢所有读到这篇文章的人 我的应用程序中的Hibernate fw有问题。下图显示了导致错误的数据库部分的示意图 (来源:) 我的代码是由反向工程自动生成的,为了使其正常工作,我必须向代码生成器“显示”模块应用程序表不是多对多表(使用cutom反向工程策略)。现在,当我运行代码时,出现以下错误: Error creating Session: org.hibernate.MappingException: Repeated column in mapping for entity:

首先,我要感谢所有读到这篇文章的人

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


(来源:)

我的代码是由反向工程自动生成的,为了使其正常工作,我必须向代码生成器“显示”模块应用程序表不是多对多表(使用cutom反向工程策略)。现在,当我运行代码时,出现以下错误:

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;
    }
}
@实体
@表(name=“module\u application”,catalog=“domotics”)
公共类ModuleApplication实现java.io.Serializable
{
/**
* 
*/
私有静态最终长serialVersionUID=4725933797587110677L;
私有模块应用程序id;
私人申请;
专用模块;
私有集moduleApplicationStatuses=新哈希集(0);
公共模块应用程序()
{
}
公共模块应用程序(模块应用程序id、应用程序应用程序、模块模块)
{
this.id=id;
这个应用程序=应用程序;
this.module=模块;
}
公共模块应用程序(模块应用程序id、应用程序应用程序、模块模块、设置模块应用程序状态)
{
this.id=id;
这个应用程序=应用程序;
this.module=模块;
this.moduleApplicationStatus=moduleApplicationStatus;
}
@嵌入ID
@属性溢出(
{
@AttributeOverride(name=“networkAddress”,column=@column(name=“network\u address”,nullable=false,length=45)),
@AttributeOverride(name=“applicationId”,column=@column(name=“application\u id”,nullable=false))
})
公共模块应用程序ID getId()
{
返回此.id;
}
public void setId(ModuleApplicationId)
{
this.id=id;
}
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“application\u id”,nullable=false,insertable=false,updateable=false)
公共应用程序getApplication()
{
返回此应用程序;
}
公共应用程序(应用程序)
{
这个应用程序=应用程序;
}
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“network\u address”,nullable=false,insertable=false,updateable=false)
公共模块getModule()
{
返回此.module;
}
公共无效设置模块(模块)
{
this.module=模块;
}
@OneToMany(fetch=FetchType.LAZY,mappedBy=“moduleApplication”)
公共集getModuleApplicationStatuses()
{
返回此.moduleApplicationStatus;
}
public void设置模块应用程序状态(设置模块应用程序状态)
{
this.moduleApplicationStatus=moduleApplicationStatus;
}
}

如我们所见,insert和update都设置为false。如果有人知道此错误的确切原因和/或如何解决,请分享这些知识

我发现你在[这篇文章]()中可能有同样的问题

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

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

仅将应用程序和模块的标识保留为ModuleApplication中的字段。您可以使用查询检索给定ModuleApplication的应用程序或模块

public class ModuleApplication {

    private ModuleApplicationId id;

    private Set<ModuleApplicationStatus> moduleApplicationStatuses = new HashSet<ModuleApplicationStatus>(0);
}

Application application = applicationRepository.findBy(moduleApplication.getApplicationId());
公共类模块应用程序{
私有模块应用程序id;
私有集moduleApplicationStatuses=新哈希集(0);
}
Application Application=applicationRepository.findBy(moduleApplication.getApplicationId());

我试图不改变我的ER模型,我倾向于认为框架需要关注数据库模型,而不是相反。您能再解释一下“使用查询检索应用程序”的含义吗?@GustavoSgarbiCampos我同意您的看法,但有时必须做出妥协并更新答案。非常感谢您的帮助。我不太了解存储库解决方案,您能再解释一下吗?我试图删除getApplication和setApplication方法,以及'@manytone'和'@JoinColumn'注释,但错误不断发生@GustavoSgarbiCampos对不起,是我的错。我误解了错误堆栈。请参阅更新的答案。