11
Июн
2021

Не могу сконфигурировать связь OneToOne в Hibernate

Здравствуйте уважаемые форумчане. Двунаправленное отображение. Суть: 2 класса: Электронная почта и RobotInfo.

RobotInfo имеет поле «fk_email_id», которое относится к полю «email_id» в таблице электронной почты. 

Проблема: когда вы вызываете findAll в EmailDAO и RobotInfoDAO, есть записи, для которых связанные объекты инициализируются (для roboticinfo-> email, а для email-> roboticinfo) null значением. Ставлю 2-3 дня, не понимаю, как наладить эти отношения В базе все правильно, соблюдается правило FK (т.е. я не могу добавить запись "RobotInfo", не прикрепив к ней запись из таблицы Email)

Email class code:

    @Entity
@Data
@EqualsAndHashCode
@Table(name = "emails")

public class Email implements Serializable {
    @Serial
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "email_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)

    private Integer email_id; // id в таблице на него будет ссылаться таблица robot_info

//another fields


    //@OneToOne(fetch = FetchType.EAGER,cascade = CascadeType.ALL, mappedBy = "email")
    //@OneToOne(targetEntity = RobotInfo.class)
    //@OneToOne(mappedBy = "email")


//    @OneToOne(targetEntity = RobotInfo.class,mappedBy = "email")


    private RobotInfo robotInfo;

    @OneToOne(cascade = CascadeType.ALL,fetch = FetchType.LAZY, mappedBy="email_robot_info")
    public RobotInfo getRobotInfo() {
        return robotInfo;
    }

Code class RobotInfo:

@Component
@Entity
@Data
@AllArgsConstructor
@Table(name= "robot_info")

public class RobotInfo implements Serializable {

    @Id
    @Column(name = "robot_info_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private  Integer robot_info_id;// id в таблице


    @Column(name = "fk_email_id")
    private Integer fk_email_id;


    //@OneToOne(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
    //@JoinColumn(name = "email_id")
    //@JoinColumn(name = "fk_email_id",referencedColumnName = "email_id")

//            @OneToOne(targetEntity = Email.class,cascade = CascadeType.ALL,optional = true)
//            @PrimaryKeyJoinColumn
//            @JoinColumn(name = "fk_email_id", referencedColumnName = "\"emails\".\"email_id\"")
//            @OneToOne(targetEntity = Email.class,cascade = CascadeType.ALL)
//            @JoinColumn(referencedColumnName = "email_id",name = "fk_email_id")

    @OneToOne(cascade = CascadeType.ALL,fetch = FetchType.LAZY)
    @PrimaryKeyJoinColumn
    @JoinColumn(name="email_id", unique=true, nullable=false)
    private Email email_robot_info;



    //@OneToOne
    //@JoinColumn(name = "fk_email_id", referencedColumnName = "\"emails\".\"email_id\"")


    public RobotInfo(Email email_robot_info) {
        this.email_robot_info = email_robot_info;
    }
    public RobotInfo() {}
}

Блин, уже 2-3 дня борюсь с проблемой ... Не понимаю в чем дело. Пробовал разные варианты fetching. Учитывая, что EAGER по умолчанию

Источник: https://ru.stackoverflow.com/questions/1294177/%D0%9D%D0%B5-%D0%BC%D0%BE%D0%B3%D1%83-%D1%81%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-%D1%81%D0%B2%D1%8F%D0%B7%D1%8C-onetoone-%D0%B2-hibernate

Тебе может это понравится...

Добавить комментарий