2013-12-11 2 views
0

У меня есть переходный булев элемент, который должен быть установлен в true, когда я получаю объект из db, но он должен быть ложным, когда я создаю новый объект, пока он не будет сохранен. После сохранения в db член должен стать истинным. Есть ли способ сделать спящий режим автоматически управляемым, или я должен сделать это в менеджере? Надеюсь, что следующий код разъяснит мои потребности.hibernate значение по умолчанию переходного элемента

class MyEntity(){ 
    @Id 
    Integer id; 

    @Transient 
    boolean required; 
} 

class Test(){ 
    MyEntity entity1 = new MyEntity(); 
    assertFalse(entity1.required); 

    persist(entity1); 
    assertTrue(entity1.required); 

    MyEntity entityAlreadySaved = getMyEntityWithID(1); 
    assertTrue(entityAlreadySaved.required); 
} 
+0

Вы, кажется, не понимают, что такое переходный is - это способ сообщить поставщику персистентности (Hibernate в этом случае) «игнорировать это свойство». Поэтому в основном вы говорите, что игнорируете поле, а затем вы ожидаете, что он все равно посмотрит на него. Бедный спящий режим! – Gimby

ответ

2

Вам не нужно это поле, так как вы можете сказать от своего id, если лицо уже сохраняется или нет. Если id - null, то это новое, иначе это не так.

Вам нужен только метод, если вам действительно нужен он, который проверяет наличие поля id.

В большинстве случаев рекомендуется использовать @GeneratedValue рядом с @Id, поэтому Hibernate будет обрабатывать идентификаторы для вас.

Если вам действительно нужно это поле, используйте поле id, чтобы установить его значения либо в конструкторе, либо в методах установки (в зависимости от того, что использует Hibernate).

+0

Спасибо за отзыв, но проблема в том, что пользователь должен увидеть все MyEntity в таблице (gui) с проверкой, если необходимо, а другой - без проверки. Если один MyEntity не требуется, пользователь должен снять флажок, и объект должен быть удален из db (сделано в менеджере). – holap

+0

setId никогда не вызывается, и никакой конструктор не изменяет id. Не знаю, где он установлен. В любом случае я изменил логику. Как всегда, это всегда верно, но в crud gui я устанавливаю его true в конструкторе, и я меняю его только на компоненты, созданные для конфигурации. Это решает все мои проблемы. Но это уродливо. Правильное решение будет удаляться, поскольку оно является избыточным. Чем gui должен использовать прокси-сервер, который украшает MyEntity и добавляет требуемую настройку с правильным значением. Это поле будет управляться только gui и не будет помешать серверному коду и программистам-головоломкам. Спасибо за помощь. – holap

0

Basicaly Hibernate не обрабатывает @ Переменные поля. Таким образом, вы должны справиться сами.
по умолчанию boolean variable имеет значение false. если вы хотите установить его дифракционную картину, то вы должны wirte логику, основанную на Адама ответить
, например

class MyEntity{ 
@Id 
Integer id; 

@Transient 
boolean required; 

public Integer getId() { 
    return id; 
} 

public void setId(Integer id) { 
    this.id = id; 
} 

public boolean isRequired() { 
    if (getId() == null){ 
     setRequired(false); 
    }else{ 
     setRequired(true); 
    } 
    return required; 
} 

public void setRequired(boolean required) { 
    this.required = required; 
} 

}
И вы должны обрабатывать удалить логику seperatly

+0

Спасибо, как прокомментировал ответ Адама, я не могу так поступать, но это моя вина, что я не объяснил. В любом случае, я понял, что мне нужно это делать. – holap

Смежные вопросы