OneToOne сопоставление JPA — каскад.Все не копируют столбец id

#java #hibernate #jpa #hibernate-annotations

#java #впасть в спящий режим #jpa #спящий режим-аннотации

Вопрос:

Я попытался найти эту конкретную проблему, но не смог получить никакой помощи

При создании Employee -> Учетная запись должна быть создана.

Мои сущности -> Сущность сотрудника

     @Entity
@Table(name = "EMPLOYEE")
public class EMPLOYEE implements Serializable {

    private static final long serialVersionUID = -1798070786993154676L;


    @Id
    @Column(name = "EMPLOYEE_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int EMPLOYEE_id;

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

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

    
  
    @OneToOne(cascade=CascadeType.ALL)
    @JoinColumn(name = "EMPLOYEE_id")
    @MapsId
    private ACCOUNT account;


    // getters and setters 
}
 

сущность учетной записи ->

     @Entity
@Table(name = "ACCOUNT")
public class ACCOUNT implements Serializable {

    private static final long serialVersionUID = -6790693372846798580L;



    @OneToOne( fetch = FetchType.LAZY)
    @JoinColumn(name = "EMPLOYEE_id")
    private EMPLOYEE employee

    @Id
    @Column(name = "account_id")
    private int account_id;

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




 // getters setters 
}
 

При создании Employee -> Учетная запись должна быть создана.

Мой pojo отображается правильно, как показано ниже ->

  employee = { EMPLOYEE_id = 0 ,
        EMPLOYEE_name = 'abc' ,
        EMPLOYEE_desc = 'new employee' ,
        account = { account_id = 1 ,
                    account_desc = 'my account' ,
                    EMPLOYEE_id = 0  }
        }
 

поэтому, когда я тот же объект employee — он генерирует employee_id , но тот же employee_id не заполняется в таблице учетных записей

Это частично работает -> в таблице учетных записей Employee_id не заполняется.

Я пробовал искать так много вопросов в stackOverflw, но пока безуспешно. Любая помощь приветствуется.

Заранее благодарю вас

Комментарии:

1. что вы делаете ACCOUNT.setEmployee(employee) где-нибудь в своем коде?

2. Пожалуйста, предоставьте информацию о том, как вы создаете Employee amp; Account objects и сохраняете ее.

3. добавлена дополнительная информация о заполнении моего объекта employee

Ответ №1:

Если @OneToOne определен на обеих сторонах отношения, одна сторона должна быть владельцем. Это объект, который имеет внешний ключ. Другая сторона должна иметь атрибут mappedBy. Итак, для меня работает следующее

 @Entity
@Table(name = "EMPLOYEE")
public class EMPLOYEE implements Serializable {
  @OneToOne(cascade= CascadeType.ALL, mappedBy = "employee") // non-owner side
  private Account account;
  ....
}

@Entity
@Table(name = "ACCOUNT")
public class Account implements Serializable {
  @OneToOne( fetch = FetchType.LAZY)
  @JoinColumn(name = "EMPLOYEE_id") // owner-side
  private Employee employee;
}
 

Комментарии:

1. Привет, Раша, спасибо за ответ, но у меня это не сработало, в зависимости от контекста мой сотрудник является владельцем, когда создается учетная запись сотрудника, которая должна быть создана ,

2. Я попробовал следующее, и это сработало:<br> Сотрудник e = новый сотрудник (); Учетная запись a = новая учетная запись(); e.setAccount(a); a.setEmployee(e); EntityManager.persist(e);