Hibernate много-к-одному - плохое использование? - PullRequest
0 голосов
/ 06 апреля 2010

Просто пробую 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, Исполнитель тоже сохраняется, как я и хочу. Если я пытаюсь сохранить другой компакт-диск, но Artist уже существует, я получаю ошибки из-за нарушения ограничений.

Я хочу, чтобы Hibernate распознал, что Artist уже существует и его не нужно вставлять снова. Можно ли это сделать с помощью аннотаций? Или мне нужно управлять постоянством AudioCD и Artist отдельно?

1 Ответ

1 голос
/ 06 апреля 2010

Нет, AFAIK, вы не можете.

Поскольку name уникален для каждого экземпляра Artist, вам следует попытаться найти исполнителя по имени (через session.createCriteria(Artist.class).add(Restrictions.eq("name", artistName)).uniqueResult() или получить какой-то класс обслуживания с помощью метода Artist findByName(String artistName)) и затем решить, следует ли сохранить исполнитель или использовать существующий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...