Hibernate Validator: hbm2ddl игнорирует ограничение EmbeddedId - PullRequest
5 голосов
/ 03 апреля 2009

Здесь довольно специфический вопрос, но он беспокоит меня уже целый день:
Я использую Hibernate Core, Annotations & Validator на PostgreSQL 8.3.

У меня есть следующие настройки классов:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Entry {
    @EmbeddedId
    protected EntryPK       entryPK;
    @ManyToMany
    private Set<Comment>    comments    = new HashSet<Comment>();
...

@Embeddable
public class EntryPK implements Serializable {
    @ManyToOne(cascade = CascadeType.ALL)
    private Database    database;

    @Length(max = 50)
    @NotEmpty
    private String      pdbid;
...

Я хотел бы видеть ограничение длины, переведенное в ограничение длины в моей базе данных PostgreSQL (которая работает для других полей внутри @ Entity, а не @ Embeddable's), но, похоже, она просто не хочет работать.
Даже использование @IdClass вместо @EmbeddedId и применение ограничения длины к соответствующему полю в @Entity не устранили эту проблему: поле базы данных по-прежнему varchar 255 (примерно 250 слишком велико для моих нужд).
Кто-то может сказать, что мне не стоит беспокоиться об этом уровне детализации, но моя сторона OCD отказывается отпускать его. поля

1 Ответ

0 голосов
/ 10 августа 2017

Не ответ. Испытываю такое же поведение. Попросите автора определить, соответствует ли следующий код заявлению о проблеме.

Классы сущностей и составного идентификатора.

@Embeddable
public class MyComposite implements Serializable {
    private static final long serialVersionUID = 5498013571598565048L;

    @Min(0)
    @Max(99999999)
    @Column(columnDefinition = "INT(8) NOT NULL", name = "id", nullable = false)
    private Integer id;

    @NotBlank
    @NotEmpty
    @Column(columnDefinition = "VARCHAR(8) NOT NULL", name = "code", length = 8, nullable = false)
    private String code;
    // plus getters & setters.
}

@Entity
@Table(name = "some_entity_table")
public class MyEntity {
    @EmbeddedId
    private MyComposite composite;

    public MyComposite getComposite() {
        return composite;
    }

    public void setComposite(MyComposite composite) {
        this.composite = composite;
    }
}

Юнит-тесты для классов

@Test
public void createWithIdOutOfRangeTest(){
    Exception exception = null;
    MyEntity input = new MyEntity();
    MyEntity output = null;
    MyComposite id = new MyComposite();
    // EITHER THIS
    id.setId(123456789);
    id.setCode("ABCDEFG");
    // OR THIS
    id.setId(12345678);
    id.setCode("        ");
    input.setComposite(id);
    try {      
      output = service.create(input);
    } catch (Exception e) {
      exception = e;
    }
    Assert.assertNotNull("No exception inserting invalid id !!", exception);
    Assert.assertTrue("There was some other exception !!", exception instanceof ConstraintViolationException);
}

И, как указано в вопросе, я не получаю никаких исключений при передаче недопустимых значений в поля составного ключа (Hibernate-core:5.0.12, H2:1.4.196). Тест не пройден.

...