有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JPA hibernate一对多关系创建额外的列名

我有两个实体。我想在持久化所有者实体时级联子实体的插入,并将子实体的SSO_ID设置为生成器为所有者生成的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.
}

UserEmailID类是:

public class UserEmailId implements Serializable {

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

    // getters, setters etc.
}

相反,我得到了一个错误:

insert into hub_users_emails (user_sso_id, email_type, sso_id, start_date, user_mail) values (?, ?, ?, ?, ?)

(etc.)

binding parameter [1] as [BIGINT] - [1234837655] => this is user_sso_id

(etc.)

binding parameter [3] as [BIGINT] - [null] => this is the original sso_id

SQL Error: 904, SQLState: 42000

o.h.engine.jdbc.spi.SqlExceptionHelper : ORA-00904: "USER_SSO_ID": invalid identifier

我尝试过其他一些一对多(双向、单向等)的设置,但似乎在所有实现之间都存在这个问题

谢谢你的帮助


共 (1) 个答案

  1. # 1 楼答案

    当您使用@manytone和@OneToMany时,hibernate将在您的user_EMAILS表上创建user_sso_id。我不知道你为什么想在用户的电子邮件上再加一个ssoId。 我已经从用户电子邮件中删除了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);
        }
    }