java - 有什么方法可以在 JPA 或 Spring-data 中设置默认外键吗?

标签 java jpa annotations foreign-keys spring-data

鉴于User实体类上有以下JPA注释,是否有办法设置默认Role

@Entity 
public class User {
    ...

    @NotNull
    @ManyToOne(targetEntity = Role.class, optional = false)
    private Role role;

现在,我在初始 Wildfly 迁移中设置默认值,如下所示:

create table users (
    id bigint generated by default as identity,
    name varchar(255), pwhash varchar(255),
    role_id bigint default 1 not null,              <- defuault FK ID set
    primary key (id));
alter table users
    add constraint FKtjpac0ubm4g9y5a5qi5ivebmw foreign key (role_id)
    references roles;
insert into roles (name) values ('USER');

但是,该默认值仅在 SQL 文件中可见。我也希望 JPA 中有它。

或者这种功能是在存储库/DAO 中设置的吗?

<小时/>

基于我尝试过的答案:

@Entity
public class User {
    ...

    public final static Role DEFAULT_ROLE = new Role();
    static {
       DEFAULT_ROLE.setId(1L);
       DEFAULT_ROLE.setName("USERS");
    }

    @NotNull
    @ManyToOne(targetEntity = Role.class, optional = false)
    private Role role = DEFAULT_ROLE;

但是,这会在 INSERT 时引发 ConstraintViolationException

最佳答案

您可以使用 @Column(columnDefinition="....") 指定确切的 SQL 来创建数据库列,包括任何默认值。

为了使 Java 表示与默认值保持一致,您可以在构造时初始化 role 字段,假设 Role.defaultRoleRole code> 您想用作默认值。显然,您必须注意默认角色是否正确附加到您的 session ,即您可能希望首先从 Session 加载它:

@NotNull
@ManyToOne(targetEntity = Role.class, optional = false)
private Role role = Role.defaultRole;

关于java - 有什么方法可以在 JPA 或 Spring-data 中设置默认外键吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44234472/

相关文章:

java - 如何在@GET中添加到Web服务迭代元素?

java - 我应该在 Java 9 中要求哪个模块才能使用 JPA?

java - JPA:如何创建与实体类型相同的字段?

java - CompletableFuture 中的类未正确加载

java - 如何在 spring 中找到与 spring.xml 不在同一级别的文件?

java - 间歇性错误 org.hibernate.PersistentObjectException : detached entity passed to persist

jpa - 使用 JPA 标准使用标准构建器为 postgres jsonb 列构建谓词

java - @EnsuresNonNullIf 注释给出 "conditional postcondition not satisfied"-警告

xml - @xmlSchema 注释与 jaxb 一起使用

java - Java中如何使用注解替换代码?