Hibernate:具有复合键的单个表的父/子关系
已经讨论了一个类似的主题,但是表中没有复合键的问题。 基本上,我尝试从一个表中获取层次结构树,该表具有以下结构:Hibernate:具有复合键的单个表的父/子关系,hibernate,key,parent-child,composite,Hibernate,Key,Parent Child,Composite,已经讨论了一个类似的主题,但是表中没有复合键的问题。 基本上,我尝试从一个表中获取层次结构树,该表具有以下结构: 表示复合键的四列 包含父Id的列 其他栏目 我的目标是使用hibernate注释将单个类映射到此表,然后在此基础上构建层次结构树: @Entity @Table(name = "Enti") public class DevUnit { /** The valuable fields from the Enti table */ // Primary Key (PK)
- 表示复合键的四列
- 包含父Id的列
- 其他栏目
@Entity
@Table(name = "Enti")
public class DevUnit {
/** The valuable fields from the Enti table */
// Primary Key (PK) Object
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name = "stazione", column = @Column(name="IdStazione")),
@AttributeOverride(name = "categoria", column = @Column(name="IdCategoria")),
@AttributeOverride(name = "tipoente", column = @Column(name="IdTipoEnte")),
@AttributeOverride(name = "ente", column = @Column(name="IdEnte"))
})
private EnteDBPK EnteDBPK;
@OneToMany
@JoinColumn(name = "parentId")
private List<DevUnit> children = new ArrayList<DevUnit>();
@ManyToOne(targetEntity = DevUnit.class, optional=true, fetch=FetchType.LAZY)
@JoinColumn(name = "parenId",insertable=false,updatable=false)
private DevUnit parent = null;
// Getters and setters...
}
这些关联可能没有正确定义,因为我在尝试运行时遇到了以下错误:
org.hibernate.AnnotationException: A Foreign key refering package.DevUnit from package.DevUnit has the wrong number of column. should be 4
我确信我在这两个关联中都遗漏了一些东西,但我需要你的帮助来理解这个问题并找到解决方案
谢谢你的帮助
Antonio如果DevUnit的复合键包含4列,则引用它的外键也应包含4列:
@OneToMany(mappedBy = "parent")
private List<DevUnit> children = new ArrayList<DevUnit>();
@ManyToOne(optional=true, fetch=FetchType.LAZY)
@JoinColumns({
@JoinColumn(name = "parentIdStazione", referencedColumnName = "IdStazione"),
@JoinColumn(name = "parentIdCategoria", referencedColumnName = "IdCategoria"),
@JoinColumn(name = "parentIdTipoEnte", referencedColumnName = "IdTipoEnte"),
@JoinColumn(name = "parentIdEnte", referencedColumnName = "IdEnte")
})
private DevUnit parent = null;
@OneToMany(mappedBy=“parent”)
private List children=new ArrayList();
@manytone(可选=true,fetch=FetchType.LAZY)
@连接柱({
@JoinColumn(name=“parentIdStazione”,referencedColumnName=“IdStazione”),
@JoinColumn(name=“parentIdCategoria”,referencedColumnName=“IdCategoria”),
@JoinColumn(name=“parentIdTipoEnte”,referencedColumnName=“IdTipoEnte”),
@JoinColumn(name=“parentident”,referencedColumnName=“ident”)
})
private DevUnit parent=null;
实际上,如果默认名称没有问题,您可以在这里省略@JoinColumns
另外请注意,Hibernate文档不推荐您使用双向一对多/多对一关系(其中“一”方为拥有方)映射的方法,因此我在上面的代码段中使用了另一种方法,请参阅。感谢您的帮助。我尝试了您的代码,但出现以下错误:原因:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:field list中的未知列“devunit0\u0.parentIdCategoria”。我在那里做错什么了吗?再次感谢。@Antonio:如果您不使用Hibernate生成架构,则批注中的列名应该与架构中的列名匹配。您是对的,昨天我有点困惑:)谢谢您的帮助。如果您不介意的话,我还有一个问题:使用hibernate查询,比如“FROM DevUnit”,我会得到Enti表中所有对象的列表,每个对象都正确设置了对父单位和子单位的引用。我的问题是:有没有一种方法可以使用hibernate自动构建树结构(例如,一个根及其子根)?我目前正在手动操作,因为出于演示的目的,我需要一个递归结构,但我想知道hibernate是否可以直接处理它。@Antonio:不,没有自动操作的方法。谢谢你的回复,我将不得不坚持我目前的方法。
@OneToMany(mappedBy = "parent")
private List<DevUnit> children = new ArrayList<DevUnit>();
@ManyToOne(optional=true, fetch=FetchType.LAZY)
@JoinColumns({
@JoinColumn(name = "parentIdStazione", referencedColumnName = "IdStazione"),
@JoinColumn(name = "parentIdCategoria", referencedColumnName = "IdCategoria"),
@JoinColumn(name = "parentIdTipoEnte", referencedColumnName = "IdTipoEnte"),
@JoinColumn(name = "parentIdEnte", referencedColumnName = "IdEnte")
})
private DevUnit parent = null;