Hibernate JPA,复合键和常量值的一对一关系

问题描述 投票:0回答:1

我正在尝试实现有限类型的对象级 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

谢谢!

java hibernate jpa spring-data spring-data-jpa
1个回答
0
投票

如果您想在连接列中使用常量,只需使用公式并将常量放入值属性中即可。但请记住在“'{your Constant value}'”周围添加双引号和单引号以防止出现任何错误。

示例:

@OneToOne
@JoinColumnsOrFormulas({
   @JoinColumnOrFormula(formula=@JoinFormula(value="'1'", referencedColumnName="object_type")),
   @JoinColumnOrFormula(column = @JoinColumn("id", referencedColumnName ="object_id"))
})
private AccessLevel accessLevel;
© www.soinside.com 2019 - 2024. All rights reserved.