私は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制約を無効にするには?
getAssignments()メソッドを移動できません。しかし、私が継承型をJOINEDに変更し、getAssignments()メソッドで '@ForeignKey(" none ")'アノテーションを使用して、ユーザーとロールのFK制約を無効にします。したがって、Hibernateは、Oを参照する1つのFK制約を生成します。これは私にとっては大丈夫です。 – viliam
getAssignments()を移動できないのはなぜですか?たぶんあなたはスーパークラスをユーザーと役割だけに作成できますか? –
クラス階層が固定されていて、他のものを壊すことはできません。私はちょうどそれを維持する必要がある...何とか:)しかし、私はFKは、休止状態で生成された固定。あなたのアイデアをありがとう。 – viliam