0

我目前拥有的:

@Entity
public class Payment {

    @Id @GeneratedValue
    private long id;

    @Column(unique = true)
    private Date period; // Only used for year and month

    ...
}

@Entity
public class Department {

    @Id @GeneratedValue
    private long id;

    ...
}

支付实体只持有需要由所有部门每年和每月支付一次的默认付款。他们之间不需要任何关系,因为所有部门都支付所有款项。

我想要达到的目标:

我想区分当前共享的付款和其他一些部门特定的付款。因此,部门将能够选择使用所有共享付款(按照目前的设计)或定义自己的付款而不使用任何其他付款。

公司付款应继续以相同的方式工作,我必须确保每个部门的部门付款也是唯一的。

在 OOP 术语中,我认为我需要对以下任何选项进行建模:

在此处输入图像描述

可能第一个更合适。

请注意,我无法更改当前识别任何实体的方式。但是,我可以在任何其他字段上添加唯一性。

问题:

  1. 在 JPA2 中执行此操作的适当方法是什么?
  2. 付款层次结构是要走的路吗?应该如何映射以确保唯一字段不会发生冲突?
  3. 有什么办法可以避免等级制度?
4

3 回答 3

0

我认为这种情况确实需要一种关系:

@Entity
public class Payment {

    @Id @GeneratedValue
    private long id;

    @Column(unique = true)
    private Date period; // Only used for year and month

    @ManyToOne
    private Department department;
}

这将允许为任何部门创建任何类型的付款。至于部门的默认付款,我认为这超出了 ORM 的责任范围,应该在业务逻辑中处理。

于 2013-09-07T17:08:02.090 回答
0

如果我理解正确,您需要实现每个部门的唯一性。可以使用compound id. 几点:

  • 如果您想使用复合键(period+ department_id),您必须同时设置它们,并且您的默认付款应该具有所有默认值都属于的1常见假货。Departmentpayments
  • 在一般情况下,我会遵循凯文的方法。这很容易且不易出错。反正你决定。

@Entity
public class Payment implements Serializable {

    @EmbeddedId
    private Period period;
}

@Embeddable
public class Period implements Serializable {
    @ManyToOne
    private Department department;
    private Date period;
}


@Entity
public class Department implements Serializable {
    @Id@GeneratedValue
    private long id;

    @OneToMany
    private List<Payment> payments = new ArrayList<Payment>();
}
于 2013-09-07T21:39:40.560 回答
0

我无法将 PK 保留在我的 Payment 实体中,也无法在 Period 和 Department 上维护一个唯一索引。在数据库方面,我正在寻找这些:

付款(ID,期间,FK_Department)

并且该表应该在 Period 和 FK_Department 中添加一个唯一索引,该索引将允许 FK_Department 中的空值(因为您可以看到复合 PK 不是一个选项,因此我需要保持使用相同的 PK 结构)。使用该表,所有 FK_Department 值为空的付款将是通用/默认/公司付款,而具有非空 FK_Department 的付款将是特定部门分配的付款,因此它将使用这些而不是公司付款。

由于我对 JPA 缺乏了解,我无法复制此模式。但是,我可以创建一个类似的功能模式。这是迄今为止我想出的最好的:

在此处输入图像描述

由于其明显糟糕的期间重复,我可以设法为每个表创建两个唯一索引:一个用于 CompanyPayment 实体的 Period ,一个用于 DepartmentPayment 实体的 Period 和 Department 对:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Payment {

    @Id @GeneratedValue
    private long id;

    ...
}

@Entity
public class CompanyPayment extends Payment {

    @Column(unique = true)  
    public Date period;

    ...
}

@Entity
@Table(uniqueConstraints =
    @UniqueConstraint(columnNames = { "period", "department_id" })
)
public class DepartmentPayment extends Payment {

    public Date period;

    @ManyToOne(optional = false)
    @JoinColumn(name = "department_id")
    private Department department;

    ...
}

我现在将使用此解决方案,但我愿意接受任何其他更好的解决方案。

于 2013-09-09T19:00:59.667 回答