2011-08-29 266 views
3

我有一个具有与另一个实体“B”的一对多关系(1:n)的实体“A”。不幸的是,(多年存在的)数据库将B中的列定义为A的主键为NOT NULL,但该关系不是强制性的。因此,如果没有Emmity A相关,则此列只会获得-1。如何在JPA关系中将值设置为NULL

我该如何映射JPA/Hibernate?我收到以下异常:

Exception in thread "main" 
javax.persistence.EntityNotFoundException: 
Unable to find A with id -1 

我知道这是正确的,但也许有一种解决方法?

请不要怪我对数据模型:-)

回答

0

您可以使用@NotFound(action = NotFoundAction.IGNORE)注解放在B.a财产。但是这只会在阅读关联时才起作用。如果你想能够设置B.a为空,并使其在数据库中插入-1而不是null,我不知道。

+0

'@ NotFound'注解有助于加载这些实体及其关系。我现在使用继承来修复NULL-Assignments:'ExplicitObject.setRelation(relObj)'在内部调用'AbstractParent.setRelationId(relObj == null?-1:relObj.getId())'。真棒JPA/Hibernate如何简化事情:-) –

0

我知道在数年后,颠倒过来的数据模型并非在公园散步。尤其是因为您必须查看每个附加应用程序的每个角落等等,以查看它是否受到影响。这是一个外键,改变它会影响很多东西,或者至少在很大程度上是可能的。

这就是说它可能仍然是wellworth交谈负责DBA如何使用一些结构来

  • 保存当前数据模型
  • 让您访问以不同的方式
数据

Oracle数据库(最新版本)有一些选项,如可更新视图和伪列以及其他选项。我不是一个DBA自己,但我看到在使用伪列的,例如,将站在为外键复印件(对表/实体A)一些潜在列不同的是它会

  • 显示每个值-1为空
  • 可以确保一个null值插入被翻译成-1它指的是列(可能通过使用触发器)

如果你改变你的Hibernate/JPA安装使用该列,而不是原来的一个..

我只是h你有一个有一定经验的DBA,更重要的是 - 不用担心试验(当然,在测试环境中)。

祝你好运! Wim

相关问题