Java Hibernate 3 OneTONE使用PostgreSQL
我有关系:客户有账户。因此,下面的实现是 Account.class: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
@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”具有相同的值。所以一个客户有一个账户