JPA休眠一对多关系会创建额外的列名

时间:2018-06-28 16:19:46

标签: java hibernate jpa

我有两个实体。我想在所有者实体持久化时级联插入子实体,并将子实体的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]绑定为[BIGINT]-[1234837655] =>这是user_sso_id

     

(等)

     

将参数[3]绑定为[BIGINT]-[null] =>这是原始的sso_id

     

SQL错误:904,SQLState:42000

     

o.h.engine.jdbc.spi.SqlExceptionHelper:ORA-00904:“ USER_SSO_ID”:无效的标识符

我尝试了一些其他的一对多设置(双向,单向等),但是在所有实现之间似乎仍然存在此问题。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

在使用@ManyToOne和@OneToMany时,hibernate将在USER_EMAILS表上创建user_sso_id。我不确定为什么要在USER_EMAILS上使用另一个ssoId。 我已从USER_EMAILS删除了sso_id,现在一切正常。我知道这不是您问题的确切答案。以下代码可能会对您有所帮助。

@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);
    }
}