Hibernate: Родительские / дочерние отношения для одной таблицы с составным ключом - PullRequest
0 голосов
/ 19 мая 2011

Подобная тема уже была рассмотрена, но без проблемы наличия составного ключа в таблице.В основном я пытаюсь получить иерархическое дерево из одной таблицы, которая имеет следующую структуру:

  • Четыре столбца, представляющие составной ключ
  • Столбец, содержащий родительский идентификатор 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...
}

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

Я уверенЯ что-то упускаю в обеих ассоциациях, но мне нужна ваша помощь, чтобы понять проблему и найти решение.

Спасибо за вашу помощь.

Антонио

1 Ответ

0 голосов
/ 19 мая 2011

Если составной ключ 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.Двунаправленный .

...