私は 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;
これにより、postgres で次の sql が生成されます。
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 にはカスケード バージョンのみが必要です。カスケード ルールは作成されません。
どうしたの?
ありがとうニコラ