Java Hibernate 3 OneTONE使用PostgreSQL

Java Hibernate 3 OneTONE使用PostgreSQL,java,hibernate,postgresql,Java,Hibernate,Postgresql,我有关系:客户有账户。因此,下面的实现是 Account.class: @Column(name = "client_id") @GeneratedValue(generator = "gen") @GenericGenerator(name = "gen", strategy = "foreign", parameters = { @Parameter(name = "property", value = "clientDTO") }) priva

我有关系:客户有账户。因此,下面的实现是

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;
我初始化了一个客户机、帐户,并将帐户设置为该客户机,但当我尝试将其保存到db时,出现了一个异常:

java.sql.BatchUpdateException:批处理条目0插入到 public.accounts(余额、客户id、注释、信用额度、id)值 (1000.0,0,注释,0.0,8)已中止。将getNextException调用到 看看原因

如您所见,我的应用程序尝试插入客户端id为0的帐户


如何解决此问题?

使用java.lang.Integer而不是原始int,这样Hibernate就可以知道它尚未设置,需要生成(或作为null传递)。或者您可以指定unsaved value=0(但不确定如何从注释中执行)

查看我对的答案。如果值应与
帐户
表的id相同,则您不需要在
帐户
表中添加
客户id
列。您可以将account表的id设置为主键,并将其设置为引用
客户机
表的外键

这就是您使用
@GenericGenerator
strategy='foreign'
所建议的,但是您缺少
@PrimaryJoinColumn
注释。除此之外,您的
@OneToOne
属性位于错误的一侧。根据您的例外情况,账户实体应参考客户,反之亦然


我已经解决了。主要问题是双向关系。所以我必须把账户设为客户,客户设为账户。谢谢大家

我已经编辑过,现在这里是另一个例外;)批处理条目0插入public.clients(accountDTO_id、address、type_id、comment、email、name、password、phone、id)值(15、NULL、0、NULL、NULL、NULL、name、password、NULL、27)已中止。调用getNextException查看原因。您想做什么?您是希望帐户ID与客户端ID具有相同的值(不需要额外的客户端ID列),还是只希望在帐户表具有客户端ID列的情况下进行简单的一对一映射?请发布您的表定义和基础数据库异常(从postgresql日志文件)。尝试直接使用“插入到public.accounts(余额、客户端id、注释、信用额度、id)值(1000.0、0、注释、0.0、8)”查询您的DB,并告诉我们DB在这方面的说明case@tscho我想查看帐户的“客户id”字段,与字段“id”具有相同的值。所以一个客户有一个账户