当前位置: 首页 > 知识库问答 >
问题:

Hibernate:“实体中重复的列映射”与“属性中不允许混合可更新和不可更新的列”

祁和通
2023-03-14

我有遗产数据库。

+----+  +------------+ +------------+
|Site|  |Content     | |Program     |
+----+  +------------+ +------------+
|id  |  |id:PK       | |siteId:PK,FK|
|name|  |siteId:FK   | |code:PK     |
+----+  |prog_code:FK| |name        |
        |prog_param  | +------------+
        +------------+  

表内容有一个PK列。siteId列不是PK的一部分。表程序有两个PK列(siteId、code)。它是复合PK。此表用作模板。程序中唯一的变量是parameter,它位于表内容的prog_param列上。

+-----------+  +------------+  +-----------+  +---------------+
|Site       |  |Program     |  |ProgramId  |  |Content        |
+-----------+  +------------+  +-----------+  +---------------+
|id:long    |  |id:ProgramId|  |site:Site  |  |id:long        |
|name:String|  |name:String |  |code:String|  |site:Site      |
+-----------+  |param:String|  +-----------+  |program:Program|
               +------------+                 +---------------+
+-----------+  +------------+  +-----------+  +-------------------+
|Site       |  |Program     |  |ProgramId  |  |Content            |
+-----------+  +------------+  +-----------+  +-------------------+
|id:long    |  |id:ProgramId|  |site:Site  |  |id:long            |
|name:String|  |name:String |  |code:String|  |site:Site          |
+-----------+  +------------+  +-----------+  |program:Program    |
                                              |programParam:String|
                                              +-------------------+

作为代码

@Entity
@Table(name = "SITE")
@Getter @Setter
public class Site {
    @Id
    @Column(name = "SITE")
    protected String id;

    @Column(name = "NAME")
    protected String name;
}


@Entity
@Table(name = "PROGRAM")
@Getter @Setter
public class Program {
    @EmbeddedId
    protected ProgramId id;
    @Column(name = "NAME")
    protected String name;
}

@Embeddable
@Getter @Setter @EqualsAndHashCode
public class ProgramId implements Serializable{
    @ManyToOne
    @JoinColumn(name = "SITE")
    protected Site site;

    @Column(name = "code")
    protected String code;
}

@Entity
@Table(name="CONTENT")
@Getter
@Setter
public class Content {
    @Id
    @Column(name = "ID")
    protected Long id;

    @ManyToOne
    @JoinColumn(name = "SITEID",referencedColumnName="SITE")
    protected Site site;


    @OneToOne
    @JoinColumns({
        @JoinColumn(name="SITEID",referencedColumnName="SITE"),
        @JoinColumn(name="PROG_CODE",referencedColumnName="CODE"), 
    })
    protected Program program;
}

但这不是工作。Hibernate引发“实体映射中重复列”异常。

所以我研究了一些解决方案。最后,我发现这个'Republic column in mapping for Entity'异常抛出,当Hibernated无法确定使用哪个属性时。

因此,我尝试将“insertable=false,updatable=false”设置为内容的属性“program”

    @OneToOne
    @JoinColumns({
        @JoinColumn(name="SITEID",referencedColumnName="SITE", insertable=false, updatable=false),
        @JoinColumn(name="PROG_CODE",referencedColumnName="CODE"), 
    })
    protected Program program;

这也不是工作。“不允许在属性中混合可更新列和不可更新列”引发异常。

因此,我将set'insertable=false,updatable=false‘设置为'PROG_CODE',当然,当我设置不同的PROG_CODE时,Hibernate不会更改PROG_CODE。

共有1个答案

史烨
2023-03-14

我也有同样的问题,两个复合键共享一个属性失败,“实体映射中的重复列”。我认为这可能是一个bug,参见:https://hibernate.atlassian.net/browse/hhh-4582。我使用的是Hibernate 3.6.4

 类似资料:
  • 我有一个PSU实体: null 我收到错误:

  • 我有一个非常简单的基于控制台的(不是应用服务器部署的)JPA程序,我对Eclipse Link和Hibernate提供商进行了测试。所有的代码都是JPA,所以我想我可以毫无问题地切换提供商。然而,当使用Hibernate作为提供程序时,程序会成功,但在Eclipse Link中会失败。 关键部分是这个(我在防火墙后面,所以我看不到格式,因为“所以需要来自另一个域的JavaScript…”因此,如果

  • 我有一个JPA程序,其中Eclipse Link是持久性提供程序。当我合并一个用户实体、更改其ID并尝试再次合并同一个用户实例时,会抛出一个错误。我重写代码,以最简单的方式说明我的问题。 上述代码不在事务上下文中。userManager是一个注入EntityManager的无状态会话bean。执行时,控制台将打印: 异常发生在第二次合并()调用时。 如果我创建一个新用户,设置它的ID并合并它,它的

  • 问题内容: 特定实体存在映射例外。不能弄清楚问题出在哪里。我从头到尾检查了所有映射3次。我仍然收到映射异常。 发送给员工的电子邮件仅映射一次。但它仍然报告错误重复映射 错误是: 电子邮件Pojo email.hbm.xml 相关脚本 发送给员工的电子邮件仅映射一次。但它仍然报告错误重复映射 问题答案: 您是否将Employee中的集合设置为逆?

  • 我有一个批处理过程,它正在为一组实体重新计算数据。通过Hibernate从DB获取实体列表: 当流程运行时,某些实体似乎正在分离,导致两种症状: 当尝试获取惰性数据时,我得到一个异常: 在我的第一次尝试中,我试图通过调用inside

  • 问题内容: 编辑:当我说“ SQL Server”时,我实际上是在谈论Management Studio。 抱歉,这令人困惑。 哦,我讨厌这种事情发生。昨天我在使用SQL Server,并尝试使用PIVOT命令来弄清楚它是如何工作的。因此,我创建了一个包含四列的新表,第一列的前几行将具有相同的值。 我在第一行,第一列中添加了“ value1”,然后按回车键–因为还没有添加任何键或约束,它使我可以向