Java 带注释的休眠:";映射fo实体中的重复列";-复合PK
首先,我要感谢所有读到这篇文章的人 我的应用程序中的Hibernate fw有问题。下图显示了导致错误的数据库部分的示意图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:
(来源:) 我的代码是由反向工程自动生成的,为了使其正常工作,我必须向代码生成器“显示”模块应用程序表不是多对多表(使用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对不起,是我的错。我误解了错误堆栈。请参阅更新的答案。