Отображение аннотаций внешнего ключа много-к-одному Hibernate - PullRequest
0 голосов
/ 05 марта 2012

Я использую 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 для таблицы назначений?

1 Ответ

0 голосов
/ 05 марта 2012

Вы должны переместиться

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

в абстрактный класс, он одинаков для обоих классов.

И чтобы ответить на ваш вопрос - после этого вы можете изменить свой InheritanceType на JOINED(или SINGLE_TABLE, но вы сказали, что у вас есть много других подклассов, так что это не подходит) - тогда у вас будет только одна таблица со столбцом owner_oid, на которую можно ссылаться из присваивания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...