Hi, you can refer to hibernate_reference.pdf, Chapter 21. Example: Parent/Child, that can help you.
If you don't want explicit send save child method, it seems that you must use CascadeType.ALL in relationship annotation.
Code:
@Entity
public class AudioAsset extends BaseEntity {
private Set<AudioFile> audioAssets=new HashSet<AudioFile>();
@OneToMany(cascade = { CascadeType.ALL}, fetch = FetchType.EAGER)
@JoinTable(table = @Table(name = "ShowAssets"), joinColumns = { @JoinColumn(name = "showid") }, inverseJoinColumns = @JoinColumn(name = "id"))
@IndexColumn(name = "showassetid")
public Set<AudioFile> getAudioAssets() {
return audioAssets;
}
public void setAudioAssets(Set<AudioFile> audioAssets) {
this.audioAssets = audioAssets;
}
}
Code:
@Entity
public class AudioFile extends BaseEntity{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Code:
@EmbeddableSuperclass
public class BaseEntity {
private int id;
private int version;
@Id(generate=GeneratorType.AUTO)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Version
public int getVersion() {
return version;
}
public void setVersion(int version) {
this.version = version;
}
}
public static void main(String[] args) {
SessionFactory sf = new AnnotationConfiguration().addAnnotatedClass(
BaseEntity.class).addAnnotatedClass(AudioFile.class)
.addAnnotatedClass(AudioAsset.class).buildSessionFactory();
Session s;
Transaction tx;
s = sf.openSession();
tx = s.beginTransaction();
AudioAsset aa = new AudioAsset();
AudioFile a = new AudioFile();
a.setName("beautiful lily");
aa.getAudioAssets().add(a);
s.save(aa);
tx.commit();
s.close();
sf.close();
}
You can see this console ouput if property hibernate.show_sql=true:
Hibernate: insert into AudioAsset (version, id) values (?, null)
Hibernate: call identity()
Hibernate: insert into AudioFile (version, name, id) values (?, ?, null)
Hibernate: call identity()
Hibernate: insert into ShowAssets (showid, id) values (?, ?)