我有两个实体。我想在所有者实体持久化时级联插入子实体,并将子实体的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”:无效的标识符
我尝试了一些其他的一对多设置(双向,单向等),但是在所有实现之间似乎仍然存在此问题。
感谢您的帮助。
答案 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);
}
}