Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA与序列化行为_Java_Jpa_Serialization_Transient - Fatal编程技术网

Java JPA与序列化行为

Java JPA与序列化行为,java,jpa,serialization,transient,Java,Jpa,Serialization,Transient,基本上,我希望使实体中的JPA持久化字段在手动序列化时表现为瞬态 我有一个这样的基础课: @Entity public class Foo implements Serializable{ @Id @GeneratedValue(strategy=GenerationType.TABLE) long id; String field; get/set field; } 在序列化时,id也被序列化。当我反序列化这个类并将其持久化时,它仍然具有相同的ID,并且(与JPA合

基本上,我希望使实体中的JPA持久化字段在手动序列化时表现为瞬态

我有一个这样的基础课:

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

  String field;

  get/set field;

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

我试图让身份证暂时化,但这把JPA搞砸了。我尝试的第二件事是在反序列化之后将id设置为null。在那之后,坚持是有效的。但是,对于许多不同的实体,这变得相当乏味,我回到了我最初的问题


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

通过将注释移动到getter方法来使用属性访问,并将字段标记为transient,而不是使用@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;}
  ..

我建议在需要新对象时将id置零。让它暂时化似乎不是一个好主意,如果您需要在某个时刻序列化真实对象,该怎么办

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


这很好,但是它说,
实体类[…]没有定义主键
那么您没有设置访问类型,仍然在字段上添加注释。您不能在属性和字段上混合注释,或者忽略一些注释,除非您使用JPA2中的Access注释来定义它并为某些映射覆盖它。不过,在您的属性上保持一致更简单