много ко многим и целостность при сохранении нуля - PullRequest
1 голос
/ 16 марта 2011

У меня есть два класса Software, Tag - они связаны ManyToMany. Мы НЕ МОЖЕМ создавать Программное обеспечение, не помещая в него тег.

Я хочу написать тест, который проверяет, что:

</p> <p>@Test public void createSoftwareWithNullTags() {</p> <pre><code> List<Tag> tags = null; Software software = new Software("software1", "description1", tags); try { software.save(); fail("tags should not be null"); } catch (Exception ex) { // NEVER COME HERE !!! } }

Итак, этот тест не пройден. Я думаю, что это не очень хороший тест для этого случая - потому что он даже не пытается сохранить данные в таблицу SOFTWARE_TAG. Конечно, я мог бы сделать проверку вручную, но я хочу реализовать ее в режиме гибернации, используя некоторые аннотации или что-то еще. Является ли это возможным? Или как бы вы это сделали?

Мои сущности:

@Entity public class Tag extends Model {</p> <pre><code>public String title; public Tag(String title) { this.title = title; } @ManyToMany( cascade = {CascadeType.ALL}, mappedBy = "tags", targetEntity = Software.class ) public List<Software> softwares;

}

</p> <p>@Entity public class Software extends Model {</p> <pre><code>public String title; public String description; @ManyToOne(optional = false) public Author author; @ManyToMany(cascade = CascadeType.ALL) @JoinTable( name = "SOFTWARE_TAG", joinColumns = @JoinColumn(name = "Software_id"), inverseJoinColumns = @JoinColumn(name = "Tag_id") ) public List<Tag> tags; public Software(String title, String description, Author author, List<Tag> tags) { this.title = title; this.description = description; this.author = author; this.tags = tags; }

}

Ответы [ 2 ]

2 голосов
/ 16 марта 2011

Вы не можете сделать это с "простой" Hibernate. Вам нужно будет использовать Hibernate Validator, который является реализацией JSR "Bean Validation". В этом конкретном случае вы бы использовали аннотацию @Size со свойством min, скажем, 1.

http://docs.jboss.org/hibernate/validator/4.2/reference/en-US/html_single/#validator-defineconstraints-builtin

Редактировать: я действительно думаю, что вы должны рассмотреть возможность создания исключения NullPointerException, если вы не ожидаете, что параметр будет нулевым На мой взгляд, вы должны использовать Bean Validation only , чтобы предотвратить "пользовательские" ошибки. Чтобы избежать ошибок программирования (например, нулевого значения, когда это не приемлемо), следует придерживаться исключений: -)

1 голос
/ 16 марта 2011

M: N в Hibernate немного "хитры" и не очень подходят для вашего сценария.Я бы порекомендовал:

  • Преобразовать отношение M: N в две зависимости 1: M.Программное обеспечение - средний класс - Tag.Таким образом, вы можете добавить @Required на стороне программного обеспечения и работать с более простыми 1: M rels.
  • Добавить некоторую пользовательскую проверку для этого

Если вы сохраняете текущий M: N,не забудьте изменить свой каскадный атрибут.Я бы сказал, что прямо сейчас, если вы удалите объект Software, вы удалите все связанные с ним теги (которые могут использоваться другими объектами Software) и вызовете беспорядок.

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