休眠:如何通过级联插入一对多子项



我正在尝试保留一个新的"用户主题"对象,并将"主题"表中对应于多个userId的新UserTopic映射

我不知道我在这里做错了什么。下面是我的代码和例外。

我的用户主题实体:

@Entity
@Table(name="USERS_TOPICS")
public class UserTopics {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name="TOPICUSER_ID")
    private Integer id;
    @Column(name="USER_ID")
    private Integer userId;
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "TOPICS_TOPICS_ID")
    private Topics topics;
    // Getters and setters

和主题实体:

    @Entity
    @Table(name="TOPICS")
    public class Topics {
        @Id
        @GeneratedValue(strategy= GenerationType.IDENTITY)
        @Column(name="TOPICS_ID")
        private Integer id;
        @Column(name="TOPICNAME")
        private String topicName;
        @OneToMany(mappedBy = "topics", cascade= {CascadeType.ALL,CascadeType.PERSIST})
        private Set<UserTopics> userTopics;
       //Getter and setters

在我的服务类中,我正在尝试保存用户主题,如下所示:

 @Service("userTopicsService")
    @Transactional
    public class UserTopicsServiceImpl implements UserTopicsService {

        @Autowired
        TopicsDao topicsDao;

        @Override
        public void createTopicc(int UserIdOne, int UserIdTwo) {
        Set<UserTopics> userTopics = new HashSet<>();
        Topics topic = new Topics();
        topic.setTopicName(String.valueOf(UserIdOne+UserIdTwo));
        UserTopics userTopicOne = new UserTopics();
        userTopicOne.setUserId(UserIdOne);
        userTopics.add(userTopicOne);
        UserTopics userTopicTwo = new UserTopics();
        userTopicTwo.setUserId(UserIdTwo);
        userTopics.add(userTopicTwo);
        topic.setUserTopics(userTopics);
        topicsDao.saveTopic(topic);
    }
   //Other methods...

以下例外情况

    18:58:54.434 [http-apr-8080-exec-9] WARN org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 1048, SQLState: 23000
18:58:54.434 [http-apr-8080-exec-9] ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Column 'TOPICS_TOPICS_ID' cannot be null
18:58:54.442 [http-apr-8080-exec-9] DEBUG org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Warning
java.sql.SQLWarning: Column 'TOPICS_TOPICS_ID' cannot be null
    at com.mysql.jdbc.SQLError.convertShowWarningsToSQLWarnings(SQLError.java:779)
    at com.mysql.jdbc.SQLError.convertShowWarningsToSQLWarnings(SQLError.java:707)

对于每个用户主题,您应该在保存之前设置 Topic 对象:

public void createTopicc(int UserIdOne, int UserIdTwo) {
    Set<UserTopics> userTopics = new HashSet<>();
    Topics topic = new Topics();
    topic.setTopicName(String.valueOf(UserIdOne+UserIdTwo));
    UserTopics userTopicOne = new UserTopics();
    userTopicOne.setUserId(UserIdOne);
    userTopicOne.setTopics(topic);
    userTopics.add(userTopicOne);
    UserTopics userTopicTwo = new UserTopics();
    userTopicTwo.setUserId(UserIdTwo);
    userTopicTwo.setTopics(topic);
    userTopics.add(userTopicTwo);
    topic.setUserTopics(userTopics);
    topicsDao.saveTopic(topic);

更新

此外,在您的主题实体中..使用休眠级联选项,如下所示(而不是JPA选项):

@OneToMany(mappedBy = "topics")
@Cascade({CascadeType.SAVE_UPDATE})
private Set<UserTopics> userTopics;

所以解决方案是:

将级联类型添加到用户主题实体中的主题对象,如下所示:

    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "TOPICS_TOPICS_ID")
    private Topics topics;

而我的服务类中保存新主题及其子用户主题的代码如下。

    Topics topic = new Topics();
    topic.setTopicName(String.valueOf(UserIdOne+UserIdTwo));
    Set<UserTopics> userTopics = new HashSet<>();
    UserTopics userTopicOne = new UserTopics();
    userTopicOne.setUserId(UserIdOne);
    userTopicOne.setTopics(topic);
    UserTopics userTopicTwo = new UserTopics();
    userTopicTwo.setUserId(UserIdTwo);
    userTopicOne.setTopics(topic);
    userTopics.add(userTopicOne);
    userTopics.add(userTopicTwo);
    List<UserTopics> userTopicsList = new ArrayList<>();
    userTopics.add(userTopicOne);
    userTopics.add(userTopicTwo);
    for(UserTopics next : userTopics) {
        userTopicsDao.save(next);
    }

相关内容

  • 没有找到相关文章

最新更新