Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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
Hibernate:具有复合键的单个表的父/子关系_Hibernate_Key_Parent Child_Composite - Fatal编程技术网

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的列
  • 其他栏目
我的目标是使用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...
}
这些关联可能没有正确定义,因为我在尝试运行时遇到了以下错误:

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;