2013-11-25 4 views
0

У меня есть класс, аннотированный с @Entity, который хранится в базе данных. Теперь то, что я хочу сделать, это продлить его, но класс ребенок не должен быть сохранен на всех:Аннотировать объект с @Transient

@Entity(name = "A") 
public abstract class A { 

    private String field; 

    public String getField() { 
     return field; 
    } 

    public abstract void print(); 
} 

public class B extends A { 

    @Override 
    public void print() { 
     System.out.println(getField()); 
    } 
} 

Почему я не могу комментировать B с @Transient, чтобы предотвратить создание дополнительных ненужных записей в базе данных? Возможно, я пропустил что-то важное?

+0

@Transient - это аннотация JAX-B, используемая для контроля того, какие поля обращаются к/из XML и не имеет никакого отношения к JPA, поэтому она не имеет никакого эффекта. – Pace

+0

@Pace '@ Transient' представляет собой аннотацию JPA (она также относится к сохранению пакета) и используется для полей, которые не являются постоянными: http://docs.oracle.com/javaee/5/api/javax/persistence/ Transient.html –

+0

Вы правы. У меня было это полностью назад в голове. Сожалею. – Pace

ответ

1

Для того, чтобы избежать того, чтобы случаи B получить сохраняются, вам не нужно аннотировать его с @Transient (который используется для обозначения полей/свойств, которые не являются постоянными), а избежать аннотирования его с @Entity или просто не список находится в файле persistence.xml.

Кроме того, вы должны убедиться, что ваш код никогда не попытается сохранить такой тип, иначе будет выбрано исключение.

+0

только для уточнения: если я затем создаю экземпляр B и сохраняю данные, не будет ли он сохранен в базе данных (я использую Hibernate, если это действительно имеет значение)? – hoefling

+0

Нет, это не будет сохраняться, потому что вы не аннотировали его с @Entity. Но если ваш код попытается его сохранить (каким-то образом), будет выбрано исключение. –

+0

понял! Большое спасибо за объяснение! – hoefling

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