避免瞬态.TransientPropertyValueException而不使用cascade = Cascade.ALL

时间:2017-06-20 13:46:02

标签: hibernate jpa java-ee

我想在不添加 Cascade = CascadeType.ALL 的情况下解决Transient Object Exception。一开始,这是我的实体。第一个是 Person.java

public class Person implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@ManyToOne
//(cascade = CascadeType.ALL)
private Address address;
---------
}

地址在数据库中只有两个元素(“label”= USA,“label”= Canada)。这是一个数据存储库。直到这里,每件事情都没有问题,但问题从这两个实体开始。

这是我的实体合同

public class Contract implements Serializable{

private static final long serialVersionUID = 1L;    
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)

private int id;

@ManyToOne(cascade =CascadeType.ALL)
private Person person;
}

最后一个也是最重要的实体 Company.java

public class Company implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private Contract contract;
    }

这就是问题所在,当我想创建一家公司时,我遇到了这个错误:

org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing

有些人会告诉我在私人地址之前添加 Cascade = CascadeType.ALL ,但我不想这样做,因为地址是数据存储库而我不想坚持它我可以所有事情的级联都会持续存在。

谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

如果private void setMapType() { final CharSequence[] MAP_TYPE_ITEMS = {"Road", "Satellite", "Hybrid"}; AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Set map type"); int checkItem = 0; builder.setSingleChoiceItems( MAP_TYPE_ITEMS, checkItem, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { switch (item) { case 0: mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); break; case 1: mMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE); break; case 3: mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); break; } dialog.dismiss(); } } ); AlertDialog fMapTypeDialog = builder.create(); fMapTypeDialog.show(); } 对象实际上是数据库中的静态数据,则必须首先查找它们,然后将它们分配给各自的Address对象。您不能只使用数据填充它们并分配它们。

Person

JPA会知道除非你做一些事情来改变它的状态,否则它不需要再次保留 Address usaAddress = em.createTypedQuery("select a from Address where label = 'USA'", Address.class) .getSingleResult(); Person usaPerson = new Person(); usaPerson.setAddress(usaAddress); ...

答案 1 :(得分:0)

解决方案很简单我刚刚添加了 @Transient 注释