JPA Hibernate отношения один ко многим создает дополнительное имя столбца - PullRequest
0 голосов
/ 28 июня 2018

У меня есть две сущности. Я хочу каскадно вставить дочернюю сущность, когда сущность владельца сохраняется, и установить SSO_ID дочерней сущности на тот, который был сгенерирован для владельца генератором.

@Entity(name = "USERS")
@Table(name = "USERS")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ID_GENERATOR")
    @SequenceGenerator(name = "ID_GENERATOR", sequenceName = "ID_SEQUENCE")
    @Column(name = "SSO_ID")
    private Long ssoId;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    private List<UserEmail> userEmails = new ArrayList<>();

    // getters, setters etc.
}

@Entity(name = "USER_EMAILS")
@Table(name = "USER_EMAILS")
@IdClass(UserEmailId.class)
public class UserEmail {

    @Id
    @Column(name = "SSO_ID")
    private Long ssoId;

    @Id
    @Column(name = "USER_MAIL")
    private String userMail;

    @Id
    @Column(name = "START_DATE")
    private Date startDate;

    @Id
    @Column(name = "EMAIL_TYPE")
    private String emailType;

    @ManyToOne(fetch = FetchType.LAZY)
    private User user;

    // getters, setters etc.
}

Класс UserEmail ID:

public class UserEmailId implements Serializable {

    private Long ssoId;
    private String userMail;
    private Date startDate;
    private String emailType;

    // getters, setters etc.
}

Вместо этого я получаю сообщение об ошибке:

вставить в значения hub_users_emails (user_sso_id, email_type, sso_id, start_date, user_mail) (?,?,?,?,?)

(и т.д.).

параметр привязки [1] as [BIGINT] - [1234837655] => это user_sso_id

(и т.д.).

параметр привязки [3] as [BIGINT] - [null] => это исходный sso_id

Ошибка SQL: 904, SQLState: 42000

o.h.engine.jdbc.spi.SqlExceptionHelper: ORA-00904: "USER_SSO_ID": неверный идентификатор

Я пробовал некоторые другие настройки от одного ко многим (двунаправленный, однонаправленный и т. Д.), Но, похоже, эта проблема сохраняется между всеми реализациями.

Помощь приветствуется.

1 Ответ

0 голосов
/ 29 июня 2018

Когда вы используете @ManyToOne и @OneToMany, hibernate создаст user_sso_id в вашей таблице USER_EMAILS. Я не уверен, зачем вам нужен еще один ssoId на USER_EMAILS. Я удалил sso_id из USER_EMAILS, и теперь он работает нормально. Я знаю, что это не точный ответ на ваш вопрос. Следующий код может помочь вам.

@Entity(name = "USERS")
@Table(name = "USERS")
@Setter
@Getter
public class User {

 @Id
 @SequenceGenerator(name = "ID_GENERATOR", sequenceName = "ID_SEQUENCE")
 @GeneratedValue(generator = "ID_GENERATOR" )
 @Column(name = "SSO_ID")
 private Long ssoId;

 @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "user")
 private List<UserEmail> userEmails = new ArrayList<>();

}



@Setter
@Getter
@Entity(name = "USER_EMAILS")
@Table(name = "USER_EMAILS")
@IdClass(UserEmailId.class)
public class UserEmail {


 @Id
 @Column(name = "USER_MAIL")
 private String userMail;

 @Id
 @Column(name = "START_DATE")
 private Date startDate;

 @Id
 @Column(name = "EMAIL_TYPE")
 private String emailType;

 @ManyToOne(fetch = FetchType.LAZY)
 private User user;

}


@Setter
@Getter
public class UserEmailId implements Serializable {

  private String userMail;
  private Date startDate;
  private String emailType;

}


public class SomeClass{ 

 public User saveUser(){
     User user = new User();
     UserEmail userEmail = new UserEmail();
     userEmail.setUser(user);
     userEmail.setEmailType("type");
     userEmail.setStartDate(new Date());
     userEmail.setUserMail("someEmail@gmail.com");
     user.setUserEmails(Arrays.asList(userEmail));
     userRepo.save(user);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...