Пример гибернации OneToMany с композитным ключом - PullRequest
4 голосов
/ 17 июня 2009

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

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

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

    b) ключ (item) типа string

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

Ответы [ 2 ]

4 голосов
/ 18 июня 2009

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

@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()    
}
0 голосов
/ 22 июня 2009

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

@ Entity открытый класс 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 представит их.

@ Встраиваемые общественный класс 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) Натал / РН - Бразилия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...