Hibernate列表映射约束违规

时间:2015-01-30 08:51:33

标签: java database hibernate list mapping

这些是我的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的更新。同样,也许我并不理解这种用法​​的正确用法。

2 个答案:

答案 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>