2013-07-02 4 views
0

В принципе, я хочу сделать JPA-сохранялось поле в моей Сущности вести себя, как это преходяще на ручной сериализацииJPA и поведение Сериализация

У меня есть базовый класс, как это:

@Entity 
public class Foo implements Serializable{ 
    @Id 
    @GeneratedValue(strategy=GenerationType.TABLE) 
    long id; 

    String field; 

    get/set field; 

} 

На сериализации id также сериализуется. Когда я десериализую этот класс и сохраняю его, он по-прежнему имеет тот же идентификатор и (после слияния с JPA) тот же экземпляр в базе данных. Хотя это, вероятно, предполагаемое поведение, я хочу, чтобы десериализованный объект был новым объектом в базе данных при десериализации.

Я попытался сделать идентификатор переходным, но это испортило JPA. Вторая вещь, которую я пробовал, заключалась в том, чтобы установить id на нуль после десериализации. После этого упорные работы. Но это становится довольно утомительным со многими разными Существами, и я возвращаюсь к своему оригинальному Вопросу.

Есть ли более простой способ? переопределение метода readObject(...) и установка id в значение null не работают, поскольку JPA также использует эти методы.

ответ

1

Я рекомендовал бы обнуление из ид, когда вы хотите новый объект. Сделать переходный процесс кажется плохой идеей, что, если вам нужно сериализовать реальный объект в какой-то момент.

Если вы используете EclipseLink, он также предлагает копию() API, который может клонировать объект и Null идентификатор,

http://wiki.eclipse.org/EclipseLink/Examples/JPA/AttributeGroup#Copy_Examples

0

Используйте доступ к свойствам путем перемещения аннотаций к вашим методам получения и отметьте поле как переходное, а не используя @Transient. JPA будет игнорировать поле и использовать методы получения/установки на карту собственности, в то время как сериализация будет видеть поле непостоянно и игнорировать его:

@Entity 
public class Foo implements Serializable{ 
    transient long id; 
    String field; 
    @Id 
    @GeneratedValue(strategy=GenerationType.TABLE) 
    public long getId(){ return id; } 
    .. 

    @Basic 
    public String getField() {return field;} 
    .. 
+0

Это было бы хорошо, но он говорит, 'Entity класс [.. .] не имеет первичного ключа. – Simiil

+0

. Тогда вы не задали тип доступа и аннотации по полям. Вы не можете смешивать аннотации по свойствам и полям или некоторые игнорируются, если вы не используете аннотацию Access в JPA 2, чтобы определить ее и переопределить для некоторых сопоставлений. Упростить, чтобы они соответствовали вашим свойствам, хотя – Chris

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