Пример гибернации OneToMany с композитным ключом

Можете ли вы дать мне пример отображения Hibernate для следующей ситуации:

  1. Родительская таблица (foo) с простым первичным ключом (foo_id)
  2. детский стол (bar) с составным ключом, состоящим из

    а) Внешний ключ к родительской таблице (foo_id)

    б) ключ (item) типа строка

  3. Есть один родитель для многих детей
  4. Родительский класс будет иметь список дочерних объектов
  5. Когда родительский класс сохранен, обновлен, удален, изменения будут каскадно передаваться дочернему классу.

2 ответа

Решение

Я не сделал именно то, что вы просите, но это может начать вас в правильном направлении. Я думаю, что это должно работать. Эта страница объясняет эти аннотации более подробно.

@Entity
public class Foo {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    public Long getId(){

    }
    ...
    @OneToMany(mappedBy="foo")
    public Collection<Bar> getBars() {

    }


...
}


@Entity
@IdClass(BarPk.class)
public class Bar implements Serializable {
    @ManyToOne
    @JoinColumn(name="foo")
    @Id
    public Foo getFoo() {
        return foo;
    }

    @Column(name="key", length=255)
    @Id
    public String getKey(){

    }

}


@Embeddable
public class BarPk implements Serializable {
    public Foo getFoo() {
        return foo;
    }
    public void setFoo(Foo foo) {

    }
    public String getKey(){
    ...
    }   

    public void setKey(String key){
    ...
    }     

    //you must include equals() and hashcode()    
}

Да, вы должны использовать следующее отображение

@Entity public class Parent {

@Id
private Integer id;

@CollectionOfElements
@JoinTable(
    name="Child",
    joinColumn=@JoinColumn(name="PARENT_ID"))
@IndexColumn("childIndex")
private List<Child> childList = new ArrayList<Child>();

}

Обратите внимание, что @CollectionOfElements и IndexColumn являются специфическими для Hibernate аннотациями, а не спецификацией JPA 1.0. JPA 2.0 представит их.

@Embeddable открытый класс Child {

// @Embeddable class does not contains identifiers 
// child class specific property's

}

Так что следующий код будет работать нормально

Parent parent = new Parent ();

parent.getChildList (). add (new Child ()); parent.getChildList (). add (new Child ()); // другой ребенок

session.save(родитель); // Родитель и двое детей будут сохранены

Недостатком этой проблемы является то, что аннотация @CollectionOfElements применяется только к классу @Embeddadble, а не к классу Entity. Если вы хотите, чтобы класс Child был классом Entity, я хотел бы увидеть решение. Невозможно применять одновременно аннотации @Entity и @Embeddable к классу.

С уважением Артур Рональд Ф.Д. Гарсия (Java-программист) Натал / Р.Н. - Бразилия

Другие вопросы по тегам