Java JPA与序列化行为
基本上,我希望使实体中的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合
@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注释来定义它并为某些映射覆盖它。不过,在您的属性上保持一致更简单