Hibernate вставить каскад без вставки внешнего ключа - PullRequest
8 голосов
/ 21 декабря 2010

У меня есть две сущности:

@Entity
public class File
.......
@Id @GeneratedValue(strategy=GenerationType.AUTO)
private int id;
@OneToMany(fetch=FetchType.LAZY, mappedBy="file", cascade=CascadeType.ALL)
private List<Tag> tags;
.......
OTHER PROPERTIES
.......

@Entity
public class Tag
.......
@Id @GeneratedValue(strategy=GenerationType.AUTO)
private int id;
@ManyToOne
@JoinColumn(name="file_id")
private File file;
@Column
private String tag;
.......
OTHER PROPERTIES
.......

Я пытаюсь вставить в файл (и впоследствии тег), выполнив следующие действия:

File file = new File();
Tag tag = new Tag();
tag.setTag("tag1");
Tag2 tag2 = new Tag();
tag2.setTag("tag2");
List<Tag> tags = new ArrayList<Tag>();
tags.add(tag);
tags.add(tag2);
file.setTags(tags);
---Add other file attributes here---

Затем я вставляю файл вмой DAO использует:

sessionFactory.getCurrentSession().saveOrUpdate(file); 

В моих журналах я вижу вставку в мою таблицу «file» и 2 вставки в мою таблицу тегов, однако внешний ключ в моей таблице тегов, который указывает на мою таблицу файлов (file_id) НЕДЕЙСТВИТЕЛЕН.

Что я мог сделать не так?

Ответы [ 2 ]

14 голосов
/ 21 декабря 2010

Вы не устанавливаете файл для тега, просто тег для файла. Помните, что в ООП, в отличие от реляционной модели, вы должны установить оба конца отношений. Вы не можете перейти от тега к файлу только потому, что вы добавили набор тегов в файл. В вашем случае вы можете просто перейти от файла к тегу (то есть: список всех тегов для файла). Вы не можете сказать, к какому файлу относится тег, глядя только на тег.

Обычно в одной из моделей используется вспомогательный метод, например:

public void addTag(Tag tag) {
  this.tags.add(tag);
  tag.setFile(this);
}

См. this для примера (из набора тестов Hibernate):

3 голосов
/ 21 декабря 2010

Внешний ключ в базе данных отражает состояние Tag.file (поскольку Tag является стороной-владельцем отношения как сторона «многие» в двунаправленном отношении «многие-к-одному»).

Я не вижу, где вы его установили.

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