Hibernate:使用复合键的单个表的父/子关系

问题描述:

已经涵盖了一个类似的主题,但没有表中存在组合键的问题。 基本上我试图让一个层次树了一个表,它具有以下结构:代表包含父ID Hibernate:使用复合键的单个表的父/子关系

  • 其他列
  • 组合键
  • A柱

    • 四列

    我的目标是使用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

    +0

    感谢您的帮助。我试过你的代码,但我得到以下错误:引起:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:'字段列表'中的未知列'devunit0_.parentIdCategoria'。我在那里做错了什么?再次感谢。 – 2011-05-19 14:15:42

    +0

    @Antonio:如果您不使用Hibernate生成模式,则注释中的列名应与模式中的列名匹配。 – axtavt 2011-05-19 15:46:30

    +0

    你说得对,昨天我有点困惑:)谢谢你的帮助。我还有另外一个问题,如果你不介意的话:用一个像“FROM DevUnit”这样的hibernate查询,我得到一个在Enti表中所有对象的列表,其中每一个对象都有父对象和子对象的引用正确设置。我的问题是:有没有办法使用hibernate自动构建一个树结构(例如,一个单一的根与其子)?我目前正在手动执行此操作,因为出于presentatin目的,我需要一个递归结构,但我想知道hibernate是否可以直接处理它。 – 2011-05-20 07:51:51