次のSQLスキーマレイアウトがあります。
-- postgresql82+ syntax
create table AudioTracks (
id serial primary key
, name text
, size integer
, filePath text
, additionDate timestamp default now()
);
create table Genres (
id serial primary key
, name text unique -- here is the unique constraint which troubles me
, description text
, additionDate timestamp default now()
);
create table AudioTrackGenre (
genreId integer references Genres (id) unique
, audioTrackId integer references AudioTracks (id) unique
, additionDate timestamp default now()
);
そして、テーブルへの2つの対応するマッピング:
@Entity(name = "AudioTracks")
public class AudioTrack implements Serializable {
@Id
@Column
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column
private String name;
@Column
private Integer size;
@Column
private String filePath;
@Column
@Temporal(TemporalType.TIMESTAMP)
private Date additionDate;
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL )
@JoinTable(name = "AudioTrackGenre",
joinColumns = { @JoinColumn(name = "audioTrackId") },
inverseJoinColumns = { @JoinColumn(name = "genreId") }
)
@OrderBy("name")
private Set<Genre> genres = new HashSet<Genre>();
// setter/getter methods //
....
}
と
@Entity(name = "Genres")
public class Genre implements Serializable {
@Id
@Column
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column
private String name;
@Column
private String description;
@Column
@Temporal(TemporalType.TIMESTAMP)
private Date additionDate;
@ManyToMany(mappedBy = "genres")
private Set<AudioTrack> audioTracks = new HashSet<AudioTrack>();
public Genre() { }
public Genre(String name) { this.name = name; }
// setter/getter methods //
....
}
しかし、AudioTrackを保存しようとすると、次のように、Genresテーブルにすでに存在するGenresが入力されます。
Set<Genre> genres = new HashSet<Genre>();
genres.add(new Genre("ambient"));
AudioTrack track = new AudioTrack();
track.setGenres(genres);
audioTrackService.addAudioTrack(track);
(最低のDAOレベルでaudioTrackService.addAudioTrack(track)
動作します)sessionFactory.getCurrentSession().save(track)
私は得ています:
ERROR: ERROR: duplicate key value violates unique constraint "genres_name_key"
Detail: Key (name)=(ambient) already exists.
Genres
カスケード挿入のテーブルに既存のジャンルを再挿入しないようにHibernateに指示するにはどうすればよいですか?