【问题标题】:Hibernate does not accept ManyToOne as IdHibernate 不接受 ManyToOne 作为 Id
【发布时间】:2014-06-27 08:55:04
【问题描述】:

Hibernate 不同意这种结构。我错过了什么吗?它引发的错误:

org.hibernate.MappingException:无法在进程中找到具有逻辑名称的列:version_id

关于如何在保持复合键结构的同时修复的任何建议?

数据模型

版本有很多动作

版本有很多进程;

public class Version {
    @Id
    @Column(name = "id")
    public int Id;
}

动作有一个过程

动作只有一个版本

public class Action {
    // Action has a composite key (ID and Version ID)

    @Id
    @Column(name = "id")
    public int id;

    @Id
    @ManyToOne
    @JoinColumn(name = "version_id")
    public Version version;

    @ManyToOne
    @JoinColumns({
        @JoinColumn(name = "process_id", referencedColumnName = "id"),
        @JoinColumn(name = "version_id", referencedColumnName = "version_id")
    })
    public Process process;
}

进程有很多动作

进程只有一个版本

    public class Process {
    // Process has a composite key (ID and Version ID)

    @Id
    @Column(name = "id")
    public int id;

    @Id
    @ManyToOne
    @JoinColumn(name = "version_id")
    public Version version;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "process", targetEntity = Action.class)
    public List<Action> actions= new ArrayList<Action>();
}

模型图片: https://dl.dropboxusercontent.com/u/2294873/model.jpg

【问题讨论】:

  • 不允许在 @ManyToOne 上指定 @Column...
  • 你的桌子怎么样?
  • 好吧,我让hibernate生成它们...但是,它不是因为这个错误...
  • 我添加了我想要实现的模型的一部分的图片
  • Action.process 之前有两个JoinColumn。第二个不需要你。

标签: java hibernate composite-key many-to-one


【解决方案1】:

在 Action 类中有两个名为 version_id 的列。尝试将第二个 version_id 重命名为 process_version_id:

public class Action {
    // Action has a composite key (ID and Version ID)

    @Id
    @Column(name = "id")
    public int id;

    @Id
    @ManyToOne
    @JoinColumn(name = "version_id")
    public Version version;

    @ManyToOne
    @JoinColumns({
        @JoinColumn(name = "process_id", referencedColumnName = "id"),
        @JoinColumn(name = "process_version_id", referencedColumnName = "version_id")
    })
    public Process process;
}

【讨论】:

  • 谢谢,确实是这个问题。然而:Hibernate 不能为不同的关系重用一个列?所以我的计划是行不通的。在所有这些关系中重用 version_id 列对我来说是完全有效的。有什么建议吗?
  • 我认为不会,因为您可以在 Action 和 Process 中拥有两个不同的版本。您可以在创建操作时添加该限制(即在将流程添加到操作之前检查版本)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
  • 2019-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多