这些是我的postresql表:
CREATE TABLE "user" (
"id" int4 NOT NULL,
"activated" bool NOT NULL DEFAULT True,
CONSTRAINT "user_pkey" PRIMARY KEY("id")
);
CREATE TABLE "user_data" (
"id" int4 NOT NULL,
"user_id" int4 NOT NULL,
"idx" int4 DEFAULT NULL,
"first_name" text NOT NULL,
"last_name" text NOT NULL,
CONSTRAINT "user_data_pkey" PRIMARY KEY("id")
);
我的目标是让我的用户&#34; hibernate bean直接引用用户的数据,如List<UserData>
。这是我的hibernate映射:
<hibernate-mapping package="mypackage">
<class name="User" table="user">
<id name="id" type="long" column="id">
<generator class="sequence">
<param name="sequence">user_id_seq</param>
</generator>
</id>
<property name="activated" column="activated" type="boolean" />
<list name="data" table="user_data" cascade="all">
<key column="user_id" />
<list-index column="idx" />
<one-to-many class="UserData" />
</list>
</class>
<class name="UserData" table="user_data">
<id
name="id"
type="long"
column="id">
<generator class="sequence">
<param name="sequence">user_data</param>
</generator>
</id>
<many-to-one name="user" column="user_id" class="User" />
<property name="firstName" column="first_name" type="text" />
<property name="lastName" column="last_name" type="text" />
</class>
</hibernate-mapping>
我跑了一些测试。当我添加一个新的&#34; UserData&#34;到我的列表,然后执行session.saveOrUpdate(myUser)
它可以工作,但是当我从列表中删除一个条目并执行相同的行时,它会在告诉我ERROR [JDBCExceptionReporter] ERROR: null value in column "user_id" violates not-null constraint
之后抛出batch update user_data set user_id=null, idx=null where user_id='20' and id='46' was canceled
这种映射的正确用法是什么?谢谢
编辑:添加&#34; inverse = true&#34;并不适合我的使用,因为我需要更新用户触发UserData的更新。同样,也许我并不理解这种用法的正确用法。
答案 0 :(得分:0)
当它已经是一个非空约束时,你似乎正在尝试更新user_id = null。尝试删除它或使用可能的user_id进行更新。
错误:“user_id”列中的空值违反了非空约束 刚告诉我批量更新user_data set user_id = null后, idx = null其中user_id ='20'且id ='46'已取消
您的映射语法很好。
答案 1 :(得分:0)
您必须在双向关系中提及关系所有者(inverse = true / false)。
默认值为false。这意味着每次尝试更新User对象时,它也会尝试更新UserData列表。
当您设置inverse = true时,UserData将成为双向关系的所有者,因此当您尝试更新用户时,它不会触发UserData列表的更新。
<list name="data" table="user_data" cascade="all" inverse="true">
<key column="user_id" />
<list-index column="idx" />
<one-to-many class="UserData" />
</list>