0

私はSpring 3.1でHibernate 4を使用していますが、このマッピングから生成される外部キー制約に問題があります。多対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上の2つの制約があってはならないということ。私はロール/ユーザーが割り当てられているため、割り当てを保存できません。私はジョイントテーブルで他の解決策を考えましたが、あまりにも厄介なようです。表は

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

ようになりましょうが、私はassignment.owner_oidは、したがって、最初の2つのcolumsは常に同じになり、この結合テーブルに@MapsIdで注釈を付けています。また、O.classから拡張された複数のクラスがあります。これは、多くの結合テーブルを意味します。どのように割り当てテーブルのFK制約を無効にするには?

答えて

0

あなたは抽象クラス、両方のクラスでその同じに

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

を移動する必要があります。

あなたの質問に答えるには、継承タイプをJOINED(またはSINGLE_TABLEに変更することができますが、あなたには他の多くのサブクラスがありますので適切ではないと言います)。割り当てから参照されるべきである。

+0

getAssignments()メソッドを移動できません。しかし、私が継承型をJOINEDに変更し、getAssignments()メソッドで '@ForeignKey(" none ")'アノテーションを使用して、ユーザーとロールのFK制約を無効にします。したがって、Hibernateは、Oを参照する1つのFK制約を生成します。これは私にとっては大丈夫です。 – viliam

+0

getAssignments()を移動できないのはなぜですか?たぶんあなたはスーパークラスをユーザーと役割だけに作成できますか? –

+0

クラス階層が固定されていて、他のものを壊すことはできません。私はちょうどそれを維持する必要がある...何とか:)しかし、私はFKは、休止状態で生成された固定。あなたのアイデアをありがとう。 – viliam

関連する問題