Я использую Hibernate 4 с Spring 3.1, и у меня есть проблема с ограничениями внешнего ключа, которые генерируются из этого сопоставления.Hibernate многозначное сопоставление аннотаций внешнего ключа
@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 поэтому в этой таблице присоединиться первые два colums будет всегда одинаково. Также у меня есть еще несколько классов, которые простираются от O.class, что означает, что многие объединяют таблицы. Как отключить ограничения FK в таблице назначения?
Я не могу перемещать метод getAssignments(). Но, как вы сказали, я изменил InheritanceType на JOINED и в методе getAssignments() я буду использовать '@ForeignKey (« none »)' аннотацию, чтобы отключить ограничение FK для пользователя и роли. Поэтому hibernate будет генерировать только одно ограничение FK, которое ссылается на O, что подходит для меня. – viliam
Почему вы не можете переместить getAssignments()? Может быть, вы можете создать суперкласс только для пользователя и роли? –
Иерархия классов исправлена, я не могу изменить, это сломает другие вещи. Мне просто нужно упорствовать ... как-то :) Но я исправил FK, сгенерированный спящим. Спасибо за ваши идеи. – viliam