【问题标题】:Hibernate: Repeated Column in MappingHibernate:映射中的重复列
【发布时间】:2017-06-23 20:41:23
【问题描述】:

所以在这个示例场景中,我有一个出勤 DTO 和一个工作人员 DTO,在这种情况下,工作人员按部门分开,并且工作人员只能在一个部门内。请务必注意,Worker {id='123-123-123', department='a'}Worker {id='123-123-123', department='b'} 不同,尽管它们共享相同的 Id。

我有以下类设置来尝试通过iddepartment 分离函数

public class IdAndDepartmentPK implements Serializable {

    private String id;
    private String department;

    public IdAndDepartmentPK() {}
    ...
}

此密钥类在需要Workeriddepartment 的DTO 之间共享,以下是导致问题的两个DTO。

@Entity
@IdClass(IdAndDepartmentPK.class)
public class AttendencetDto {

    @Id private String id; // This is a departmentally unique attendenceId
    @Id private String department;
    @Column private String workerId;

    @JoinColumns({
        @JoinColumn(name = "workerId"),
        @JoinColumn(name = "department")
    })
    @ManyToOne(fetch = FetchType.EAGER)
    private WorkerDto workerDto;
    ....
 }

 @Entity
 @IdClass(IdAndDepartmentPK.class)
 public class WorkerDto {

    @Id
    private String id;

    @Id
    private String department;
    ...
 }

WorkerDto 不需要知道AttendencetDto,但AttendencetDto 确实需要访问WorkerDto 及其包含的其他数据。

Hibernate 抱怨像 workerId 这样的字段应该使用 insert="false" update="false" 进行映射,但如果我这样做,那么我将无法将这些值保存到数据库中。

我本质上希望这些字段可用,同时WorkerDto 可用,这可能吗?

【问题讨论】:

  • 为什么需要`@Column private String workerId;`?您可以通过 workerDto 链接您的实体。
  • 但是,如果我有表attendence,例如,列worker_id,是否会在没有我在dto中指定该列的情况下休眠插入数据?
  • 如果有外键连接,你可以设置workerDto,交易关闭后你的实体将被链接。
  • 实际上,您是对的,它按预期工作。干杯老兄。
  • 请标记我的答案:)

标签: java sql hibernate mapping


【解决方案1】:

您应该删除@Column private String workerId;,因为您已经通过与WorkerDto 的关系来映射它。

如果你想在它们之间创建关系,你应该在你的AttendencetDto 中使用setWorkerDto 方法并保存。交易结束后,您将在 DB 中建立您的关系。

【讨论】:

  • 接受这个答案,因为它是正确的分辨率!
猜你喜欢
  • 2020-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
  • 2015-01-11
相关资源
最近更新 更多