繁体   English   中英

Hibernate JPA @JoinColumn(nullable = false)如何仅生成数据库约束,特别是在一种@ManyToOne方法中

[英]How can Hibernate JPA @JoinColumn(nullable = false) generate ONLY database constraint, specifically in one @ManyToOne method

我的问题类似于此注释: nullable = false不仅创建数据库约束 ,而且他的解决方案禁用了休眠中的所有检查可为空性(我不希望这样做),我特别希望在此@ManyToOne关系中使用它。

我有一个RegraValidacao.java类,可以仅设置其@ManyToOne字段之一,其他字段设置为null。 那些@ManyToOne关系是通过@JoinTable建立的。 我想要的是:当通过spring.jpa.properties.hibernate.hbm2ddl.auto生成DDL时,我希望@JoinTable批注中存在的@JoinColumns仅在db2数据库上生成数据库约束NOT NULL。

因此,RegraValidacao可以与实体ContaLimite.java和Documento.java具有@ManyToOne可为空的关系。 保留仅具有ContaLimite.java的RegraValidacao应该是可以的,例如:

RegraValidacao rgr = new RegraValidacao();
rgr.setContaLimite(new ContaLimite());
rgr.setDocumento(null);

hibernate.save(rgr) // SHOULD WORK

但是,当我在JoinColumn上设置nullable = false时,它不会让Documento字段为null。

@Entity
public class RegraValidacao {

    @ManyToOne
    @JoinTable(name = "CDR_CONTA_LIMITE_REGRA", 
    joinColumns = {@JoinColumn(name = "RGR_ID", nullable = false)},
    inverseJoinColumns = {@JoinColumn(name = "CDL_ID", nullable = false)})
    private ContaLimite contaLimite;

    @ManyToOne
    @JoinTable(name = "DOR_DOCUMENTO_REGRA",
    joinColumns = {@JoinColumn(name = "RGR_ID", nullable = false)}, 
    inverseJoinColumns = {@JoinColumn(name = "DOM_ID", nullable = false)})
    private Documento documento;
}

编辑:为简化起见,我只放置了这两个属性,但实际上我在此类中有8对Attributtes / JoinTables。 又为什么呢? 因为这种关系是相互排斥的。 如果我有一个普通的表关系@ManyToOne而没有JoinTables,则我在数据库上将有7个空字段,并有1个集合。 使用JoinTables时,我将没有任何空字段,并且如果在JoinTable中设置了ID,则肯定在相关表上有一个条目。

换句话说,与ContaLimite.java和Documento.java的关系应为:optional = true,但它们在@JoinTable上的列应为nullable = false。

我的期望:

CDR_CONTA_LIMITE_REGRA --> RGR_ID NOT NULL, CDL_ID NOT NULL //OK
DOR_DOCUMENTO_REGRA --> RGR_ID NOT NULL, CDL_ID NOT NULL //OK

RegraValidacao rgr = new RegraValidacao();
rgr.setContaLimite(new ContaLimite());
rgr.setDocumento(null);

hibernate.save(rgr) // SHOULD BE OK!

我得到的是:

CDR_CONTA_LIMITE_REGRA --> RGR_ID NOT NULL, CDL_ID NOT NULL //OK
DOR_DOCUMENTO_REGRA --> RGR_ID NOT NULL, CDL_ID NOT NULL //OK

RegraValidacao rgr = new RegraValidacao();
rgr.setContaLimite(new ContaLimite());
rgr.setDocumento(null);

hibernate.save(rgr) --> Error, cannot persist null

ERROR: org.springframework.dao.DataIntegrityViolationException: not-null property references a null or transient value : br.system.regravalidacao.RegraValidacao.documento; nested exception is org.hibernate.PropertyValueException: not-null property references a null or transient value : br.system.regravalidacao.RegraValidacao.documento

这样,我希望JoinTable的列具有NOT NULL约束,但是我仍然可以使用Documento为null来保留RegraValidacao。

您正在将联接表用于两个属性。 我不推荐这个。

如果我正确理解了您的问题,则希望Documento为空,或者同时设置Documento或ContaLimite。 所以我只允许Documento为null。

好吧,我找到了合适的解决方案,但这并不是我想要的。 希望有一天能对某人有所帮助。

我想从Hibernate Runtime禁用对类的特定属性的检查null,这是我无法实现的。 我可以在整个课程RegraValidacao.java中禁用它

我创建了一个Spring @Configuration类包,其范围为.properties文件(在我的/ resources目录中),上面带有spring.jpa.properties.hibernate.check_nullability = false ,而@ComponentScan属于我的类包:

RegraValidacaoConfiguration.java:

@Configuration
@PropertySource("classpath:regravalidacao.properties")
@EntityScan(RegraValidacaoConfiguration.PACKAGE)
@ComponentScan({RegraValidacaoConfiguration.PACKAGE})
class RegraValidacaoConfiguration {
    static final String PACKAGE = "br.system.regravalidacao";
}

RegraValidacao.java:

package br.system.regravalidacao;
public class RegraValidacao {
    //...
}

regravalidacao.properties:

spring.jpa.properties.hibernate.check_nullability=false

(default) and only my package will be false. 这样,我的整个项目仍将具有 (默认值),并且只有我的软件包将为false。

唯一的伤害是我在RegraValidacao内部的其他属性(其中一些是@OneToOne)将受到check_nullability = false的错误影响,这就是为什么我想要某些属性范围而不是类范围的原因。 尽管这种伤害还算不错,因为我仍然会收到这些属性的错误,不是从Hibernate Runtime,而是从数据库。 对我来说还可以。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM