我正在尝试实现有限类型的对象级 ACL,它引导我尝试使用具有常量和动态值的复合键来创建
@OneToOne
关系。
我有一个实体,带有数据库 ID 和类中定义的常量值。
public class Entity{
private static final int objectType = 1;
@Id
Integer id;
}
我有一个
access_levels
表,其复合键为 objectId
和 objectType
。
public class AccessLevel {
@EmbeddedId
private AccessLevelKey accessLevelKey;
@Embeddable
class AccessLevelKey implements Serializable{
private Integer objectType;
private Integer objectId;
....
}
}
access_levels
的架构
CREATE TABLE access_levels(
object_type INTEGER NOT NULL,
object_id INTEGER NOT NULL,
....
CONSTRAINT access_levels_type_id PRIMARY KEY (object_type, object_id)
);
我正在尝试建立一种一对一的关系,
Entity
可以使用它来获取和更新其关联的AccessLevel
查看了非标准连接上的文档后,似乎我需要这样的东西,
实体内部:
@OneToOne
@JoinColumns({
@JoinColumn(name = "id", referencedColumnName = "object_id"),
@JoinColumn(name = "access_levels.object_type", referencedColumnName = "1"),
})
private AccessLevel accessLevel;
但是这会在应用程序启动时引发休眠
MappingException
Caused by: org.hibernate.MappingException: Unable to find column with logical name: 1 in access_levels
谢谢!
如果您想在连接列中使用常量,只需使用公式并将常量放入值属性中即可。但请记住在“'{your Constant value}'”周围添加双引号和单引号以防止出现任何错误。
示例:
@OneToOne
@JoinColumnsOrFormulas({
@JoinColumnOrFormula(formula=@JoinFormula(value="'1'", referencedColumnName="object_type")),
@JoinColumnOrFormula(column = @JoinColumn("id", referencedColumnName ="object_id"))
})
private AccessLevel accessLevel;