我是hibernate和java的新手,我试图在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;UserGroup型号:
@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中username字段的索引,表user_groups中的约束是重复的,我同时执行了ON DELETE CASCADE和ON DELETE NO操作,我只需要级联版本,表group_permissions中未创建级联规则。
怎么了?
谢谢,尼古拉
发布于 2010-09-12 17:49:13
如您所见,未创建选项卡auth_user中username字段上的索引(...)
确实如此。它显然应该被创建,注释部分看起来是正确的。作为替代,您可以尝试在Hibernate特定的@Table注释中定义索引。如下所示:
@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操作,我只需要级联版本,在表group_permissions中未创建级联规则
不能说,不能测试,没有太多相关注解的经验。也许可以搜索Hibernate的Jira中存在的问题。如果找不到任何东西,那么设置一个测试用例并创建一个问题。对不起,我没有更好的建议。
发布于 2010-09-24 03:20:52
不确定,但这让我想起了我曾经遇到的一个问题。
我在第一次运行时使用"jpa.ddl=create“创建了索引(并切换回update)。
在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您可以尝试此配置并查看是否创建了索引吗?
就我的两分钱……
https://stackoverflow.com/questions/3692775
复制相似问题