【问题标题】:ManyToOne default value多对一默认值
【发布时间】:2013-09-09 00:17:54
【问题描述】:

我有一个应用程序,其默认值保存在数据库中。 例如,具有属性 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 p = new Person();
p.setName("Smith");
personRepository.save(p);

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

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

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

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

注意:我使用 hibernate 4 和 spring 3.2

【问题讨论】:

    标签: hibernate jpa default-value many-to-one


    【解决方案1】:

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

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

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

    【讨论】:

    • 如果没有指定,我想使用 id 为 0 的城市,而不是创建一个新城市。我不明白你想用 'using Session.load()/EntityManager. getReference()'
    • 好的,我明白了:docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html_single/…。如果不需要,它会避免访问数据库,但我必须在保存之前手动完成。
    猜你喜欢
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 2011-06-08
    • 2011-12-15
    • 2014-10-02
    • 1970-01-01
    • 2014-12-23
    相关资源
    最近更新 更多