2011-05-19 61 views
0

已經涵蓋了一個類似的主題,但沒有表中存在組合鍵的問題。 基本上我試圖讓一個層次樹了一個表,它具有以下結構:代表包含父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 
    

    我我確定我在兩個協會中都缺少一些東西,但我需要你的幫助來理解問題並找到解決方案。

    感謝您的幫助。

    安東尼

  • 回答

    0

    如果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