0

基本上,我想让我的实体中的 JPA 持久字段表现得就像它在手动序列化时是瞬态的

我有一个像这样的基本课程:

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

  String field;

  get/set field;

}

在序列化时,id 也被序列化。当我反序列化此类并将其持久化时,它仍然具有相同的 ID,并且(在与 JPA 合并后)是数据库中的相同实例。虽然这可能是预期的行为,但我希望反序列化对象成为数据库中反序列化的新对象。

我试图使 id 瞬态,但这弄乱了 JPA。我尝试的第二件事是在反序列化后将 id 设置为 null。之后,坚持工作。但这对于许多不同的实体来说变得相当乏味,我回到我原来的问题。

还有比这更简单的方法吗?覆盖该readObject(...)方法并将 id 设置为 null 也不起作用,因为 JPA 也使用这些方法。

4

2 回答 2

1

通过将注释移动到您的 getter 方法来使用属性访问,并将字段标记为瞬态而不是使用 @Transient。JPA 将忽略该字段并使用 get/set 方法映射属性,而序列化将看到该字段是瞬态的并忽略它:

@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;}
  ..
于 2013-07-02T18:48:34.457 回答
1

当您想要一个新对象时,我建议您取消 id。让它瞬态似乎是个坏主意,如果您需要在某个时候序列化真实对象怎么办。

如果您使用的是 EclipseLink,它还提供了一个 copy() API,可以克隆一个对象并将 id 设为空,

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

于 2013-07-03T13:09:19.147 回答