2011-12-12 55 views
0

我有一种关系:客户有一个帐户。所以,下面的实现是Hibernate 3 OneToOne使用PostgreSQL

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插入到 公共.accounts(balance,client_id,comment,credit_limit,id)值 (1000.0,0,comment,0.0,8)被中止。调用getNextException到 查看原因。

正如您所看到的,我的应用试图插入client_id = 0的帐户;

我该如何解决?

+0

你想做什么?您是否希望帐户ID与客户端ID具有相同的值(不需要额外的client_id列),还是只需要一个普通的一对一映射,其中帐户表具有client_id列?请发布您的表定义和基础数据库异常(来自postgresql日志文件)。 – tscho

+0

尝试直接用'insert into public.accounts(balance,client_id,comment,credit_limit,id)values(1000.0,0,comment,0.0,8)'查询您的数据库,并告诉我们在这种情况下DB说什么 – Maxym

+0

@tscho我想要帐户的字段“client_id”,具有与字段“id”相同的值。所以一个客户有一个帐户 – Sergii

回答

1

使用java.lang.Integer而不是基元int--这种方式Hibernate可以告诉它尚未设置,并需要生成(或传递为null)。或者你可以指定unsaved-value = 0(不知道如何从注释做到这一点)虽然

+0

我有另一个例外;) – Sergii

+0

我已编辑,现在这里是另一个例外;) 批处理条目0插入到public.clients(accountDTO_id,地址,type_id,评论,电子邮件,名称,密码, phone,id)值(15,NULL,0,NULL,NULL,名称,密码,NULL,27)被中止。调用getNextException来查看原因。 – Sergii

0

看看我的回答this related question。如果account表的值应与account表的ID相同,则不需要client_id列中的额外列。您可以使帐户表的ID为主键外键参考client表。

这就是你的使用@GenericGeneratorstrategy = 'foreign'建议,但你错过了​​注释。在此之上你的@OneToOne属性是错误的一面。根据您的例外情况,帐户实体应引用客户端,反之亦然。

HTH

+0

明白了,我会尽力的 – Sergii

0

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