Hibernate:使用复合键的单个表的父/子关系
问题描述:
已经涵盖了一个类似的主题,但没有表中存在组合键的问题。 基本上我试图让一个层次树了一个表,它具有以下结构:代表包含父ID Hibernate:使用复合键的单个表的父/子关系
- 四列
我的目标是使用Hibernate注解映射一个类此表,然后建立我的层次树出来的:
@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...
}
的EnteDBPK是我的复合键,其定义为:
@Embeddable
public class EnteDBPK implements Serializable {
private static final long serialVersionUID = 2960251547408481498L;
/** Fields representing the composite primary key*/
private long stazione;
private long categoria;
private long tipoente;
private long ente;
public EnteDBPK(){}
public EnteDBPK(long stazione, long categoria, long tipoente, long ente){
this.stazione = stazione;
this.categoria = categoria;
this.tipoente = tipoente;
this.ente = ente;
}
// Getters and setters, equals and hashcode overrides...
}
的关联很可能未正确定义,因为我得到这个错误,当我尝试运行它:
org.hibernate.AnnotationException: A Foreign key refering package.DevUnit from package.DevUnit has the wrong number of column. should be 4
我我确定我在两个协会中都缺少一些东西,但我需要你的帮助来理解问题并找到解决方案。
感谢您的帮助。
安东尼
答
如果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;
其实你可以在这里省略@JoinColumns
如果默认名称为罚款。
另请注意,Hibernate文档不建议您使用另一种方法来映射双向一对多/多对一关系(“一方”是拥有方)上面的代码片段,请参阅2.2.5.3.1.1. Bidirectional。
感谢您的帮助。我试过你的代码,但我得到以下错误:引起:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:'字段列表'中的未知列'devunit0_.parentIdCategoria'。我在那里做错了什么?再次感谢。 – 2011-05-19 14:15:42
@Antonio:如果您不使用Hibernate生成模式,则注释中的列名应与模式中的列名匹配。 – axtavt 2011-05-19 15:46:30
你说得对,昨天我有点困惑:)谢谢你的帮助。我还有另外一个问题,如果你不介意的话:用一个像“FROM DevUnit”这样的hibernate查询,我得到一个在Enti表中所有对象的列表,其中每一个对象都有父对象和子对象的引用正确设置。我的问题是:有没有办法使用hibernate自动构建一个树结构(例如,一个单一的根与其子)?我目前正在手动执行此操作,因为出于presentatin目的,我需要一个递归结构,但我想知道hibernate是否可以直接处理它。 – 2011-05-20 07:51:51