javax.persistence / Hibernate внутри игры - PullRequest
3 голосов
/ 12 сентября 2010

Я новичок как в hibernate, так и в java, я пытаюсь определить простую модель user-> groups-> permissions в playframework, я хочу применить правило каскадного удаления на уровне базы данных и не хочуorm заботится о каскаде (что-то похожее на пассивное удаление python-sqlalchemy), вот мои модели:

Модель пользователя:

@Entity
@Table(name="auth_user")

public class User extends Model {

    @Column(name="username",nullable=false,length=40)
    @org.hibernate.annotations.Index(name = "idx_username")
    public String username;
    @Column(nullable=false,length=255)
    public String password;
    @Column(nullable=true,length=150)
    public String email;
    @Column(nullable=true,length=150)
    public String fullname;
    @Column(nullable=true)
    public boolean isAdmin;

    @OneToMany(mappedBy="group")
    public List<UserGroup> user_groups;
}

Модель группы:

@Entity
@Table(name="auth_group")

public class Group extends Model {

    @Column(nullable=false,length=40)
    public String name;

    @OneToMany(mappedBy="group")
    public List<GroupPermission> group_permissions;

    @OneToMany(mappedBy="user")
    public List<UserGroup> user_groups;

Модель разрешения:

@Entity
@Table(name="auth_permission")

public class Permission extends Model {

    @Column(nullable=false,length=40)
    public String name;
    @Column(nullable=false)
    public Integer code;

    @OneToMany(mappedBy="permission")
    public List<GroupPermission> permission_groups;

Модель GroupPermission:

@Entity
@Table(name="group_permissions")

public class GroupPermission extends Model {

    @ManyToOne
    @org.hibernate.annotations.OnDelete(action=org.hibernate.annotations.OnDeleteAction.CASCADE)
    public Group group;

    @ManyToOne
    @org.hibernate.annotations.OnDelete(action=org.hibernate.annotations.OnDeleteAction.CASCADE)
    public  Permission permission;

Модель группы пользователей:

@Entity
@Table(name="user_groups")
public class UserGroup extends Model {

    @ManyToOne
    @org.hibernate.annotations.OnDelete(action=org.hibernate.annotations.OnDeleteAction.CASCADE)
    public User user;

    @ManyToOne
    @org.hibernate.annotations.OnDelete(action=org.hibernate.annotations.OnDeleteAction.CASCADE)
    public Group group;

это генерирует следующий sql в postgres:

CREATE TABLE auth_user
(
id bigint NOT NULL,
email character varying(150),
fullname character varying(150),
isadmin boolean,
"password" character varying(255) NOT NULL,
username character varying(40) NOT NULL,
CONSTRAINT auth_user_pkey PRIMARY KEY (id)
)
WITH (
    OIDS=FALSE
);

ALTER TABLE auth_user OWNER TO postgres;
CREATE TABLE auth_group
(
id bigint NOT NULL,
"name" character varying(40) NOT NULL,
CONSTRAINT auth_group_pkey PRIMARY KEY (id)
)
WITH (
    OIDS=FALSE
);

ALTER TABLE auth_group OWNER TO postgres;

CREATE TABLE auth_permission
(id bigint NOT NULL,
 code integer NOT NULL,
 "name" character varying(40) NOT NULL,
 CONSTRAINT auth_permission_pkey PRIMARY KEY (id)
)
WITH (
    OIDS=FALSE
 );

ALTER TABLE auth_permission OWNER TO postgres;

CREATE TABLE group_permissions
(id bigint NOT NULL,
group_id bigint,
permission_id bigint,
CONSTRAINT group_permissions_pkey PRIMARY KEY (id),
CONSTRAINT fk8f9f82c43494357e FOREIGN KEY (permission_id)
    REFERENCES auth_permission (id) MATCH SIMPLE
    ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk8f9f82c4c8b3dcb6 FOREIGN KEY (group_id)
    REFERENCES auth_group (id) MATCH SIMPLE
    ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
  OIDS=FALSE
);

ALTER TABLE group_permissions OWNER TO postgres;

CREATE TABLE user_groups
(id bigint NOT NULL,
 group_id bigint,
 user_id bigint,
 CONSTRAINT user_groups_pkey PRIMARY KEY (id),
 CONSTRAINT fke27720c847140efe FOREIGN KEY (user_id)
    REFERENCES auth_user (id) MATCH SIMPLE
    ON UPDATE NO ACTION ON DELETE CASCADE,
 CONSTRAINT fke27720c86e0797ca FOREIGN KEY (group_id)
    REFERENCES auth_user (id) MATCH SIMPLE
    ON UPDATE NO ACTION ON DELETE NO ACTION,
 CONSTRAINT fke27720c8a1c053ea FOREIGN KEY (user_id)
    REFERENCES auth_group (id) MATCH SIMPLE
    ON UPDATE NO ACTION ON DELETE NO ACTION,
 CONSTRAINT fke27720c8c8b3dcb6 FOREIGN KEY (group_id)
    REFERENCES auth_group (id) MATCH SIMPLE
    ON UPDATE NO ACTION ON DELETE CASCADE
 )

 WITH (
    OIDS=FALSE
 );

 ALTER TABLE user_groups OWNER TO postgres; 

Как вы можете видеть, индекс в поле имени пользователя на вкладке auth_user не создан, ограничения в таблице user_groups дублированы, у меня есть и ON DELETE CASCADE, и ON DELETE NO ACTION, я хочу только каскадную версию, втаблица group_permissions каскадное правило не создано,

что не так?

спасибо Никола

Ответы [ 2 ]

0 голосов
/ 23 сентября 2010

Не уверен, но это напоминает мне о проблеме, с которой я однажды столкнулся.

У меня были индексы, созданные с помощью «jpa.ddl = create» при первом запуске (и переключились обратно на обновление).

В вашем файле application.conf:

# JPA Configuration (Hibernate)
# ~~~~~
#
# Specify the custom JPA dialect to use here (default to guess):
# jpa.dialect=org.hibernate.dialect.PostgreSQLDialect
#
# Specify the ddl generation pattern to use (default to update, set to none to disable it):
# jpa.ddl=update

# can you try this?
jpa.ddl=create

Можете ли вы попробовать эту конфигурацию и посмотреть, будет ли создан индекс?

Только мои 2 цента ...

0 голосов
/ 12 сентября 2010

как вы можете видеть, индекс в поле имени пользователя на вкладке auth_user не создан (...)

Действительно. И это явно должно быть создано, часть аннотации выглядит правильно. В качестве альтернативы, вы можете попробовать , чтобы определить индекс в специфической аннотации @Table в Hibernate. Как это:

@Entity
@org.hibernate.annotations.Table(
    name="auth_user",
    indexes = { @Index(name="idx_username", columnNames = { "username" } ) }
    )
public class User { ... }

Если это сработает, это будет просто обходной путь, аннотация @org.hibernate.annotations.Index на уровне атрибутов должна работать.

ограничение в таблице user_groups дублируется, у меня есть и ON DELETE CASCADE, и ON DELETE NO ACTION, я хочу только каскадную версию, в таблице group_permissions правило каскада не создано

Не могу сказать, не могу проверить, не имею большого опыта работы с соответствующими аннотациями. Может быть, искать существующие проблемы в Jira Hibernate. Если вы ничего не можете найти, настройте тестовый пример и создайте проблему. Извините, у меня нет предложений получше.

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