刚试用Hibernate(带注释),我的映射有问题。我有两个实体类,AudioCD和Artist。
@Entity
public class AudioCD implements CatalogItem {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String title;
@ManyToOne(cascade = { CascadeType.ALL }, optional = false)
private Artist artist;
....
}
@Entity
@Table(uniqueConstraints = { @UniqueConstraint(columnNames = { "name" }) })
public class Artist {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Column(nullable = false)
private String name;
.....
}
我从外部源获取AudioCD对象。当我试图坚持AudioCD时,艺术家也会坚持下去,就像我想要发生一样。如果我尝试保留另一张不同的CD,但艺术家已经存在,则由于违反约束而出现错误。
我希望Hibernate能够识别Artist已经存在且不应再次插入。这可以通过注释完成吗?或者我是否必须分别管理AudioCD和Artist的持久性?
答案 0 :(得分:1)
不,AFAIK你不能。
由于name
对于每个Artist
实例都是唯一的,因此您应尝试按名称查找艺术家(通过session.createCriteria(Artist.class).add(Restrictions.eq("name", artistName)).uniqueResult()
或使用方法Artist findByName(String artistName)
获取一些服务类)然后决定是否坚持艺术家或使用现有艺术家。