@ManyToOne与联接表的关系(可空=假)

时间:2018-09-04 13:41:12

标签: java mysql database hibernate jdbc

尝试在@ManyToOneTestEntity之间的单独表中创建TestAttr关系,以获得错误响应:

org.hibernate.PropertyValueException: not-null property references a null or transient value : com.test.TestEntity.testAttr; nested exception is javax.persistence.PersistenceException: org.hibernate.PropertyValueException: not-null property references a null or transient value : com.test.TestEntity.testAttr

这是有问题的实体:

@Table(name = "test_table")
public class TestEntity{

  @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
  @JoinTable(name = "test_attr_test_entity", joinColumns = {@JoinColumn(name = "test_entity_id", nullable = false, updatable = false)},
      inverseJoinColumns = {@JoinColumn(name = "test_attr_id", nullable = false, updatable = false)})
  private TestAttr testAttr;
  .
  .
  .
 }

当更改为@ManyToMany时,它可以正常工作。

持久性代码:

testEntityRepository.save(testEntity)

1 个答案:

答案 0 :(得分:0)

我想您应该以this为例。如果要将此处编写的内容应用于项目,则您的实体可能看起来像这样:


TestEntity

@Entity
public class TestEntity {

    @Id
    @GeneratedValue
    private Long id;

    @ManyToOne
    private TestAttr testAttr;
...

TestAttr

@Entity
public class TestAttr {

    @Id
    @GeneratedValue
    private Long id;
...

持久使用Spring Data存储库的示例:

TestAttr attr = new TestAttr();

testAttrRepository.save(attr);

TestEntity entity1 = new TestEntity();
TestEntity entity2 = new TestEntity();

entity1.setTestAttr(attr);
entity2.setTestAttr(attr);

testEntityRepository.save(entity1);
testEntityRepository.save(entity2);

表格

您现在可以看到,TestEntity在数据库中具有它的testAttr的ID:

tables in database

注意:这是单向的一对多关系。 (TestEntity引用了它的testAttr,但是TestAttr没有它的testEntities列表

您可以根据需要使用级联类型来管理回购方法的行为。 希望我有所帮助:)