【问题标题】:Hibernate many-to-one foreign key annotation mappingHibernate 多对一外键注解映射
【发布时间】:2012-03-22 18:47:17
【问题描述】:

我将 Hibernate 4 与 Spring 3.1 一起使用,但我遇到了由该映射生成的外键约束的问题。

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class O {
    private String oid;

    @Id
    @GeneratedValue(generator = "OidGenerator")
    @GenericGenerator(name = "OidGenerator", strategy = "com.evolveum.midpoint.repo.sql.OidGenerator")
    @Column(unique = true, nullable = false, updatable = false, length = 36)
    public String getOid() {
        return oid;
    }
    ...other getters and setters
}

@Entity
public class Role extends O {
    private Set<Assignment> assignments;

    @OneToMany(mappedBy = "owner")
    @Cascade({org.hibernate.annotations.CascadeType.ALL})
    public Set<Assignment> getAssignments() {
        return assignments;
    }
    ...other getters and setters
}

@Entity
public class User extends O {
    private Set<Assignment> assignments;

    @OneToMany(mappedBy = "owner")
    @Cascade({org.hibernate.annotations.CascadeType.ALL})
    public Set<Assignment> getAssignments() {
        return assignments;
    }
    ...other getters and setters
}

@Entity
public class Assignment extends IdentifiableContainer {
    private O owner;
    private Long id;

    @Id
    @MapsId("oid")
    @ManyToOne
    public O getOwner() {
        return owner;
    }

    @Id
    @GeneratedValue(generator = "ContainerIdGenerator")
    @GenericGenerator(name = "ContainerIdGenerator", strategy = "com.evolveum.midpoint.repo.sql.ContainerIdGenerator")
    @Column(nullable = true, updatable = true)
    public Long getId() {
        return id;
    }
...other getters and setters
}

这会产生这样的架构......

create table Assignment (
    id bigint not null,
    owner_oid varchar(36) not null,    
    primary key (owner_oid, id)
);
create table Role (
    oid varchar(36) not null unique,
    primary key (oid)
);
create table User (
    oid varchar(36) not null unique,
    primary key (oid)
);
alter table Assignment 
    add constraint FKB3FD62ED72781986 
    foreign key (owner_oid) 
    references User;
alter table Assignment 
    add constraint FKB3FD62ED7276AE31 
    foreign key (owner_oid) 
    references Role;

不应存在对 Assignment.owner_oid 的两个约束。由于它们,我无法保存具有分配的角色/用户。我考虑过使用连接表的其他解决方案,但我看起来太尴尬了。连接表看起来像

create table Role_Assignment (
    role_oid varchar(36) ...
    assignment_oid varchar(36) ...
    assignment_id bigint ...
    primary key (....)
);

但我的 assignment.owner_oid 用 @MapsId 注释,因此在这个连接表中,前两个列总是相同的。此外,我还有更多从 O.class 扩展的类,这意味着许多连接表。如何禁用分配表上的 FK 约束?

【问题讨论】:

    标签: spring hibernate mapping hibernate-mapping hibernate-annotations


    【解决方案1】:

    你应该搬家

    ...
    public Set<Assignment> getAssignments() {
        return assignments;
    }
    

    对于抽象类,在两个类中都是一样的。

    并回答你的问题 - 在你这样做之后,你可以将 InheritanceType 更改为 JOINED(或 SINGLE_TABLE,但你说你有许多其他子类,所以它不合适) - 那么你将只有一个带有 owner_oid 列的表从作业中引用。

    【讨论】:

    • 我无法移动 getAssignments() 方法。但正如你所说,我会将 InheritanceType 更改为 JOINED 并在 getAssignments() 方法中使用 @ForeignKey("none") 注释来禁用对用户和角色的 FK 约束。因此,hibernate 将只生成一个引用 O 的 FK 约束,这对我来说没问题。
    • 为什么不能移动 getAssignments()?也许您可以仅为用户和角色创建超类?
    • 类层次结构是固定的,我不能改变它会破坏其他东西。我只需要坚持下去......不知何故:)但我修复了休眠生成的FK。感谢您的想法。
    猜你喜欢
    • 2014-06-02
    • 2015-08-20
    • 2016-09-18
    • 2021-11-20
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多