Hibernate多对一 - 糟糕的用法?

时间:2010-04-05 20:33:47

标签: hibernate

刚试用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的持久性?

1 个答案:

答案 0 :(得分:1)

不,AFAIK你不能。

由于name对于每个Artist实例都是唯一的,因此您应尝试按名称查找艺术家(通过session.createCriteria(Artist.class).add(Restrictions.eq("name", artistName)).uniqueResult()或使用方法Artist findByName(String artistName)获取一些服务类)然后决定是否坚持艺术家或使用现有艺术家。