0

我有一个默认值保存在数据库中的应用程序。例如,具有属性 City 的类 Person 的默认值为“New York”,id 为 0。

@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 :

Person p = new Person();
p.setName("Smith");
personRepository.save(p);

如果我尝试创建一个 id 为 0 并命名为“纽约”的城市实例,我将有一个“TransientObjectException:对象引用未保存的瞬态实例”:绝对不是一个好的解决方案。

如果我在表定义中放置一个默认值,我将不得不在保存后从数据库中重新加载实体。

我可以在保存 Person 之前加载城市,但我也有 2 次访问数据库的权限。

这两个解决方案对我不利,因为我必须从数据库中显式加载 City 实例。有没有办法自动做到这一点?(也许是拦截器或类似的东西)

注意:我使用休眠 4 和弹簧 3.2

4

1 回答 1

1

如果我尝试创建一个 id 为 0 并命名为“New York”的城市实例,我将有一个“TransientObjectException:对象引用一个未保存的瞬态实例”

不应该这样。可能是因为id默认城市是0. 尝试1改用。

Session.load()或者,您可以使用/获取惰性代理而不接触数据库EntityManager.getReference()

于 2013-09-05T08:57:53.837 回答