gpt4 book ai didi

hibernate - javax.persistence/hibernate inside play

转载 作者:行者123 更新时间:2023-12-05 01:14:36 26 4
gpt4 key购买 nike

我是 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;

组权限模型:

@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中未创建级联规则,

怎么了?

谢谢尼古拉

最佳答案

as you can see the index on the username field in the tabe auth_user is not created (...)

的确如此。它显然应该被创建,注释部分看起来是正确的。作为替代方案,您能否尝试在 Hibernate 特定的 @Table 注释中定义索引。像这样:

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

如果可行,这只是一个解决方法,@org.hibernate.annotations.Index属性级别的注释应该有效。

the constraint in the table user_groups are duplicated, I have both ON DELETE CASCADE and ON DELETE NO ACTION, I want only the cascade version, in the table group_permissions the cascade rule is not created

不能说,不能测试,对相关注解没有多少经验。也许在 Hibernate 的 Jira 中搜索现有问题。如果找不到任何东西,请设置一个测试用例并创建一个问题。抱歉,我没有更好的建议。

关于hibernate - javax.persistence/hibernate inside play,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3692775/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com