2013-10-24 5 views
0

Предположим, что у меня есть класс сущности JPA с именем Photo для хранения фотографий. У меня также есть еще один не-сущностный класс с именем PhotoStatus для хранения этих данных подсчета, таких как shareCount, likeCount и commentCount. Теперь, если добавить переменную экземпляра (private PhotoStatus status;) к классу сущностей Photo держать эту информацию о состоянии, следующее сообщение об ошибке показано ниже:Почему классы сущностей JPA не могут иметь настраиваемые переменные экземпляра?

Основные атрибуты могут быть только следующих типов: Java примитивным типы, обертка примитивных типов, String, java.math.BigInteger, java.math.BigDecimal, java.util.Date, java.util.Calendar, java.sql.Date, java.sql.Time, java.sql.TimeStamp, byte [], Byte [], char [], Character [], перечисления или любой Serializable-тип.

Почему это так?

ответ

2

Если вы хотите JPA игнорировать эту конкретную собственность, вы должны дать ему @Transient аннотацию (а затем управлять его самостоятельно); если вы хотите, чтобы он сохранялся, вы должны сделать PhotoStatus подходящей сущностью.

+0

... или предоставить TypeConverter для этого типа, чтобы определить, как он будет сохраняться, или сделать его реализацией Serializable – DataNucleus

2

Если вы прочитали эту часть сообщения об ошибке, вы получите ответ.

или любой Serializable type.

Ваш пользовательский класс (PhotoStatus) должен реализовать интерфейс Serializable.

+0

Ой! Я этого не заметил. Благодаря!!! – Jomoos

+1

@Jomoos - не проблема! :) Случается всем :) – SudoRahul

+0

Технически правильно, но я бы настоятельно советовал не хранить в базе данных сериализованные объекты Java - это почти всегда ошибка дизайна, IMHO ... –

1

пытаются добавить @Transient в методе геттерного

@Transient 
public PhotoStatus getStatus() { 
    return status;  
} 
0

Похоже PhotoStatus является @Embeddable:

 
@Entity 
public class Photo { 
    ... 
    private PhotoStatus status; 
    ... 
} 

@Embeddable 
public class PhotoStatus { 
    private int shareCount; 
    private int likeCount; 
    private int commentCount; 
} 

По умолчанию это будет отображать PhotoStatus поля и столбцы с одинаковыми именами в таблице Photo «s. Чтобы разрешить использование вложенных в несколько объектов, вы можете переопределить имена столбцов по умолчанию в объекте:

 
@Entity 
public class Photo { 
    ... 
    @AttributeOverride(name="shareCount", [email protected](name = "SHARE")) 
    private PhotoStatus status; 
    ... 
} 
Смежные вопросы