Как сохранить два связанных объекта в базе данных с отношением OneToOne - PullRequest
0 голосов
/ 02 июля 2019

Когда я пытаюсь сохранить объект U, я получаю следующее исключение:

org.springframework.orm.jpa.JpaSystemException: попытка назначить идентификатор из нулевого свойства «один к одному» [com.roc.domain.A.user]; вложенным исключением является org.hibernate.id.IdentifierGenerationException: попытка присвоить идентификатор из нулевого свойства «один к одному» [com.roc.domain.A.user]

У меня есть две таблицы: 1. пользователь, что столбцы ID (авто incr, основной), имя. 2. свяжитесь с столбцами id, user_id (то есть внешний ключ -> user.id) и адресом.

@Entity
@Table(name = "a")
public class A {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "id")
  private Long id;

  @Column(name="address")
  private String address;

  @OneToOne
  @MapsId
  private U user;

  public A() {

  }
   // getters and setters



}


@Entity
@Table(name = "u")
public class U {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "id")
  private Long id;
  @Column(name="username")
  private String userName;
  @JoinColumn(name = "user_id", referencedColumnName = "id")
  @OneToOne(mappedBy = "user", cascade = CascadeType.ALL)
  private A a;

  public U(){};

}

@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTest {

  @Autowired
  private URepository uRepository;

  @Test
  public void simpleCrudTest() {
    U user = new U("name", new A("address"));
    uRepository.save(user);


  }
}

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

Однако вы правильно установили каскад, поскольку взаимосвязь является двунаправленной, вам необходимо установить обе стороны в модели в памяти.

  @Test
  public void simpleCrudTest() {
    U user = new U("name", new A("address"));

   //will work when this is added 
   a.setUser(user);
   uRepository.save(user);

  }

В противном случае, как говорится в сообщении об ошибке, A имеет нулевую ссылку для пользователя при сохранении.

0 голосов
/ 02 июля 2019

Редактировать: для сохранения с использованием одного хранилища вызовов сохранения.

    @Entity
@Table(name = "a")
public class A {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @Column(name = "address")
    private String address;

    @OneToOne
    @MapsId
    private U user;

    public A() {

    }
}

@Entity
@Table(name = "u")
public class U {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;
    @Column(name = "username")
    private String userName;
    @JoinColumn(name = "user_id", referencedColumnName = "id")
    @OneToOne(mappedBy = "user", cascade = CascadeType.ALL)
    private A a;

    public U() {
    };

    // method to manage the bidirectional association
    public U addToA(A a) {
        this.a.add(a);
        a.setUser(this);

    }

}

@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTest {

    @Autowired
    private URepository uRepository;

    @Test
    public void simpleCrudTest() {

        U user = new U();
        user.addToA(new A("address"));

        user.setUserName("username");
        uRepository.save(user);

    }
}

Также вы ссылаетесь на эту ссылку.

вставка значений в несколько таблиц с использованием спящего режима

      You have to save A first, Then set saved A to U and save U.    


        @RunWith(SpringRunner.class)
            @SpringBootTest
            public class ApplicationTest {

              @Autowired
              private URepository uRepository;

              @Autowired
              private ARepository aRepository;

              @Test
              @Trascational
              public void simpleCrudTest() {

                A a = new A();
                a.setAddress("address");
                a = aRepository.save(a);

                U user = new U("name", a);
                uRepository.save(user);


              }
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...