当前位置: 首页 > 知识库问答 >
问题:

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

鲜于浩淼
2023-03-14

这不是一个重复的问题,其他问题没有相同的情况

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)。那为什么呢?因为这种关系是相互排斥的。如果我有一个没有JoinTables的公共表关系@ManyToOne,我将在数据库上有7个空字段和1个集合。对于JoinTable,我不会有任何空字段,并且如果在JoinTable中设置了一个id,那么在相关的表上肯定会有一个条目。

换句话说,与contalimite.java和documento.java的关系应该是:optional=true,但是它们在@jointable上的列应该是nullable=false。

我的期望:通过hbm2ddl.auto生成的表:

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

在Hibernate期间持久化:

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

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

获得的内容:通过hbm2ddl.auto生成的表:

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

共有1个答案

严嘉良
2023-03-14

您正在为两个属性使用联接表。我不推荐这样。

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

 类似资料:
  • 问题内容: 在JPA中,我什么时候使用属性和注释感到困惑。有什么区别? 问题答案: 是用于生成架构的指令。在类中生成的数据库列将在实际数据库中标记为不可为空。 是运行时指令。它所做的主要功能是与延迟加载有关。您不能延迟加载非集合映射的实体,除非您记得设置了optional = false(因为Hibernate不知道那里应该有一个代理还是一个null,除非您告诉它null是不可能的,否则它可以生成

  • 问题内容: 我将Elasticsearch用作文档数据库,并且我创建的每个记录都有一个GUID ID,系统将其用作记录ID。商界人士希望提供一种功能,使用户可以基于日期和迄今为止在这一天/每月创建的记录数来拥有自己的自动文件名约定。 我需要防止重复的用户文件名。有没有一种方法可以将索引字段设置为唯一?像sql唯一约束一样? 问题答案: 您需要使用应该唯一的字段作为文档的ID。默认情况下,具有现有I

  • 9.4.2.数据库约束 再次运行这个Service,你会发现它执行失败,而在logcat中得到许多SQLException。而这都是数据库约束(database constraint)抛出的异常。 这是因为我们插入了重复的ID。前面从服务端抓取消息数据时,获得了消息的ID字段,并作为主键一并插入本地数据库。但是我们每分钟都会通过getFriendsTimeline()重新抓取最近24小时的20条消

  • 本文向大家介绍在Oracle数据库中添加外键约束的方法详解,包括了在Oracle数据库中添加外键约束的方法详解的使用技巧和注意事项,需要的朋友参考一下 外键指定一个列(或一组列)的值必须符合另一个表的一些行的值。我们说这是维持关联表的参照完整性。 在图形化界面中,在 外键 选项卡,只需简单地点击外键栏位来编辑。使用外键的工具栏,能让你创建新的、编辑或删除选择的外键栏位。 添加外键:添加一个外键到表

  • 我遇到一个情况,需要根据另一个列值对一个列[属性]强制执行唯一约束。 例如,我有一个像table(ID,EID,Name,ISDeleted)这样的表 ISDeleted只能有一个值null或'y'(active或deleted),并且我想在EID上创建一个唯一的约束,仅当ISDeleted=null时才创建ISDeleted,因为我不关心是否有多个具有相同ID的已删除记录。请注意,EID可以为空