Пример гибернации OneToMany с композитным ключом
Можете ли вы дать мне пример отображения Hibernate для следующей ситуации:
- Родительская таблица (
foo
) с простым первичным ключом (foo_id
) детский стол (
bar
) с составным ключом, состоящим иза) Внешний ключ к родительской таблице (
foo_id
)б) ключ (
item
) типа строка- Есть один родитель для многих детей
- Родительский класс будет иметь список дочерних объектов
- Когда родительский класс сохранен, обновлен, удален, изменения будут каскадно передаваться дочернему классу.
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-программист) Натал / Р.Н. - Бразилия