我有一个应用程序,其数据库中保留了默认值。 例如,具有默认属性City的类Person是ID为“New York”。
@Entity
public class Person {
@Id
private Integer personId;
private String name;
@ManyToOne
private City city;
}
@Entity
public class City {
@Id
private Integer cityId;
private String cityName;
}
在数据库中:
+--------+------------+
| cityId | cityName |
+--------+------------+
| 0 | 'New York' |
+--------+------------+
我想要做的是保存一个新人:
Person p = new Person();
p.setName("Smith");
personRepository.save(p);
如果我尝试创建一个id为0并命名为“New York”的城市实例,我将会有一个“TransientObjectException:object引用一个未保存的瞬态实例”:绝对不是一个好的解决方案。
如果我在表定义中放入一个默认值,我将不得不在保存后从数据库重新加载实体。
我可以在保存Person之前加载城市,但我也可以访问数据库。
这两个解决方案对我不利,因为我必须从数据库中明确加载City实例。有没有办法自动完成? (也许是一个拦截器或类似的东西)
注意:我使用的是hibernate 4和spring 3.2
答案 0 :(得分:1)
如果我尝试创建一个id为0并命名为“New York”的城市实例,我将会有一个“TransientObjectException:object引用一个未保存的瞬态实例”
不应该这样。也许这是由于id
默认城市为0
而造成的。请尝试使用1
。
或者,您可以使用Session.load()
/ EntityManager.getReference()
获取惰性代理,而无需触及数据库。