【问题标题】:Hibernate. Not null constraint for a few identical lists休眠。几个相同列表的非空约束
【发布时间】:2018-04-03 18:58:40
【问题描述】:

我有两个简单的实体(getter/setter 被省略):

@Entity
public class Paper {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
}

@Entity
public class Writer {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToMany
    private List<Paper> book1 = new ArrayList<>();

    @OneToMany
    private List<Paper> book2 = new ArrayList<>();
}

Hibernate 创建一个具有 3 列(writer_id、book1_id、book2_id)的中间表 writer_paper。但是我不能在书中添加任何论文,因为它违反了第二本书的非空约束。我可以以某种方式放弃或规避这个约束吗?谢谢。
更新
我正在尝试将论文添加到这样的第一本书中:

Session session = sfbean.getSessionFactory().openSession();
session.beginTransaction();

Writer writer = new Writer();
Paper paper = new Paper();
session.saveOrUpdate(writer);
session.saveOrUpdate(paper);

writer.getBook1().add(paper);
session.saveOrUpdate(writer);

session.getTransaction().commit();
session.close();

错误堆栈跟踪的一部分:
原因:org.postgresql.util.PSQLException:错误:“book2_id”列中的空值违反了 NOT NULL 约束
详细信息:错误的字符串包含 (670, null, 671)。

【问题讨论】:

  • 也许是我的错,但是..我不明白两个书单对作家的目的..作家只有两本书吗?我不清楚触发错误的操作。您应该编写对触发错误的实体执行的操作/命令,并复制错误的有用部分。从您的描述中不清楚您的用例。请完善更多细节。
  • @FabianoTarlao,这是一个演示错误的纯粹示例,因此作者拥有多少本书并不重要(真实的代码快照应该太冗长)。我用你要求的信息更新了一个帖子
  • 很奇怪,OT:我期待一个不同的表映射。也许参考 JPA(.. 并且通常我手动定义大多数表映射)执行不同,或者我没有很好地提醒。我认为您现在已经添加了所有需要的信息,以便其他“休眠”人员回答您的问题。出于好奇,让我们尝试添加 writer.getBook2().add(paper);在 writer.getBook1().add(paper) 之后; ...并查看错误是否消失。在此处发布案例.. 它可能有助于其他人跟踪问题。问候
  • 感谢您的回复。我添加了 writer.getBook2().add(paper) 但它因同样的错误而失败。 Hibernate 尝试分别为每本书添加纸张(例如 (670, null, 671) 然后 (670, 671, null))
  • 这又是一个有用的证明,让我们等待其他比我更有能力的人:-)

标签: java hibernate


【解决方案1】:

我找到了解决此问题的方法,即为每个列表创建一个单独的链接表。可以使用每个列表的 @JoinTable(name = "link_table_1") 注释来完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-20
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多