【问题标题】:Hibernate 3 OneToOne working with PostgreSQLHibernate 3 OneToOne 与 PostgreSQL 一起使用
【发布时间】:2011-12-12 19:25:33
【问题描述】:

我有一个关系:客户有一个帐户。所以下面的实现是

Account.class:

@Column(name = "client_id")
    @GeneratedValue(generator = "gen")
    @GenericGenerator(name = "gen", strategy = "foreign",
           parameters = { @Parameter(name = "property", value = "clientDTO") })
    private int client_id;

Client.class:

@OneToOne(cascade = CascadeType.ALL)
private AccountDTO accountDTO;

我初始化了一个客户、帐户,并为客户设置了帐户,但是当我尝试将其保存到数据库时,我得到了一个异常:

java.sql.BatchUpdateException: 批处理条目 0 插入 public.accounts (balance, client_id, comment, credit_limit, id) 值 (1000.0, 0, comment, 0.0, 8) 被中止。调用 getNextException 到 看看原因。

如您所见,我的应用尝试插入 client_id = 0 的帐户;

我该如何解决?

【问题讨论】:

  • 你想做什么?您是否希望帐户 ID 与客户端 ID 具有相同的值(没有额外的 client_id 列),或者您只是想要一个简单的一对一映射,其中帐户表有一个 client_id 列?请发布您的表定义和底层数据库异常(来自 postgresql 日志文件)。
  • 尝试使用'insert into public.accounts (balance, client_id, comment, credit_limit, id) values (1000.0, 0, comment, 0.0, 8)'直接查询您的数据库并告诉我们什么数据库在这种情况下说
  • @tscho 我想帐户的字段“client_id”,与字段“id”具有相同的值。所以一个客户有一个帐户

标签: java hibernate postgresql


【解决方案1】:

使用 java.lang.Integer 而不是原始 int——这样 Hibernate 可以判断它尚未设置,需要生成(或作为 null 传递)。或者您可以指定 unsaved-value=0 (虽然不确定如何从注释中做到这一点)

【讨论】:

  • 我已经编辑了,现在这里是另一个例外;)批处理条目 0 插入到 public.clients(accountDTO_id,adress,type_id,comment,email,name,password,phone,id)值(15 , NULL, 0, NULL, NULL, name, password, NULL, 27) 被中止。调用 getNextException 查看原因。
【解决方案2】:

看看我对this related question 的回答。如果值应与 account 表的 id 相同,则不需要在 account 表中添加额外的 client_id 列。您可以将帐户表的 id 作为主键和引用client 表的外键。

这就是您使用@GenericGenerator 和strategy = 'foreign' 所暗示的,但您缺少@PrimaryJoinColumn 注释。最重要的是,您的 @OneToOne 属性位于错误的一侧。根据您的例外情况,帐户实体应引用客户,反之亦然。

HTH

【讨论】:

    【解决方案3】:

    我已经解决了。主要问题是双向关系。所以我不得不将Account设置为Client,Client设置为Acount。谢谢大家!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      • 2019-06-06
      • 2012-12-13
      • 2017-10-14
      • 2021-06-18
      • 1970-01-01
      相关资源
      最近更新 更多