使用`IdClass`在Hibernate上创建复合主键,当使用`DataJpaTest`时的复合主键。

huangapple 未分类评论43阅读模式
英文:

Composite keys using IdClass on Hibernate for composite keys when using DataJpaTest

问题

以下是翻译好的内容:

我有一个类似这样的 JPA 类:

@Data
@Entity
@Table(name = "oss_org_discount")
@IdClass(OrganizationDiscountPK.class)
public class OrganizationDiscount {
    @Id
    @OneToOne(fetch = FetchType.LAZY)
    @EqualsAndHashCode.Exclude
    @JoinColumn(name = "Org")
    @ToString.Exclude
    private Organization organization;

    @EqualsAndHashCode.Include
    @ToString.Include
    private String getOrganizationId() {
        return organization.getId();
    }

    @Id
    @Column(name = "Discount")
    private String discountId;

    private String active;

    @Contract(pure = true)
    public boolean isActive() {
        return "Y".equals(active);
    }

    public void setActive(final boolean active) {
        this.active = active ? "Y" : "";
    }
}

还有一个 IdClass。

@Data
public class OrganizationDiscountPK implements Serializable {
    private Organization organization;
    private String discountId;
}

当我查看日志时,我看到以下生成的内容。

Hibernate:alter table oss_org_discount add constraint UK_ecc64ehkc31t6kf0hcdwj1tvi unique (org)

我的问题是,它不应该显示类似这样的内容吗?

Hibernate:alter table oss_org_discount add constraint UK_ecc64ehkc31t6kf0hcdwj1tvi unique (org, discount)

不确定这是否是我部分的错误还是 Hibernate 中的一个 bug。

不过,我确实看到了这个...

Hibernate:create table oss_org_discount (discount varchar(255) not null, active varchar(255), org varchar(255) not null, primary key (discount, org))

所以另一个问题就是为什么会创建一个唯一约束?

英文:

I have JPA class like this

@Data
@Entity
@Table(name = "oss_org_discount")
@IdClass(OrganizationDiscountPK.class)
public class OrganizationDiscount {
    @Id
    @OneToOne(fetch = FetchType.LAZY)
    @EqualsAndHashCode.Exclude
    @JoinColumn(name = "Org")
    @ToString.Exclude
    private Organization organization;

    @EqualsAndHashCode.Include
    @ToString.Include
    private String getOrganizationId() {

        return organization.getId();
    }

    @Id
    @Column(name = "Discount")
    private String discountId;

    private String active;

    @Contract(pure = true)
    public boolean isActive() {

        return "Y".equals(active);
    }

    public void setActive(final boolean active) {

        this.active = active ? "Y":"";
    }
}

And a IdClass.

@Data
public class OrganizationDiscountPK implements Serializable {
    private Organization organization;
    private String discountId;
}

When I view the logs I see the following generated.

Hibernate: alter table oss_org_discount add constraint UK_ecc64ehkc31t6kf0hcdwj1tvi unique (org)

My question is, shouldn't it show something like

Hibernate: alter table oss_org_discount add constraint UK_ecc64ehkc31t6kf0hcdwj1tvi unique (org, discount)

Not sure if it is an error in my part or a bug in Hibernate.

I do see this though...

Hibernate: create table oss_org_discount (discount varchar(255) not null, active varchar(255), org varchar(255) not null, primary key (discount, org))

So another question would be why would a unique constraint be created?

答案1

得分: 0

问题出在 Organization 上的 OneToOne 关系。应该改为 @ManyToOne

英文:

The issue was the OneToOne on the Organization. It should be @ManyToOne

huangapple
  • 本文由 发表于 2020年4月10日 04:46:21
  • 转载请务必保留本文链接:https://java.coder-hub.com/61129958.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定