java - 使用 Hibernate 在外键字段中插入空值

标签 java mysql hibernate spring-boot

我有一个 Question 实体和 Tag 实体,带有 getter、setter 方法和来自 questionOneToMany 关系到 tag 和从 questionuser

OneToOne 关系
public class Question {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    @Column(name="title")
    private String title;

    @Column(name="body")
    private String body;

    @Temporal(TemporalType.DATE)
    @Column(name="date_created")
    private Date date_created;

    @OneToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="user_id")
    private User user;

    @OneToMany(cascade=CascadeType.ALL)
    @JoinColumn(name="tag_id")
    private Tag tag;

    @Column(name="answer_count")
    private int answer_count;

    @Column(name="view_count")
    private int view_count;

    public Question() {

}

标记实体

public class Tag {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    @Column(name="name")
    private String name;

    @Column(name="username")
    private String username;

    @Temporal(TemporalType.DATE)
    @Column(name="date_created")
    private Date date_created;

    public Tag() {

}

当我尝试使用具有以下详细信息的 Postman 插入问题时:

{
    "title": "stefanyyyxx",
    "body": "stefandoyee44",
    "date_created": "2019-02-27",
    "user_id" : 1,
    "tag_id": 1,
    "answer_count": 0,
    "view_count": 0
}

问题库.java:

@Override
public void save(Question theQuestion) {

    // get the current hibernate session
    Session currentSession = entityManager.unwrap(Session.class);

    // save employee
    currentSession.saveOrUpdate(theQuestion);
}

尽管我使用了 JoinColumn(),但正在为 user_idtag_id 插入空值。

MySQL:

enter image description here

最佳答案

正如@Karol Dowbecki 建议的那样,

将 JSON 转换为 DTO 对象并使用该 DTO 从它们各自的 存储库 中获取 UserTag 实体。

最后创建Question实体对象并存储。

问题实体

@Entity
@Table(name = "question")
public class Question {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "title")
    private String title;

    @Column(name = "body")
    private String body;

    @Temporal(TemporalType.DATE)
    @Column(name = "date_created")
    private Date dateCreated;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "user_id")
    private User user;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "tag_id")
    private Set<Tag> tag;

    @Column(name = "answer_count")
    private int answerCount;

    @Column(name = "view_count")
    private int viewCount;

}

用户实体

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

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

}

标记实体

@Entity
@Table(name = "tag")
public class Tag {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    private String name;

    @Column(name = "username")
    private String username;

    @Temporal(TemporalType.DATE)
    @Column(name = "date_created")
    private Date dateCreated;

}

DTO 类

public class QuestionDTO {

    private Long id;

    private String title;

    private String body;

    private Date dateCreated;

    private Long user;

    private Long tag;

    private int answerCount;

    private int viewCount;
}

测试类

@Service
public class TestService {

    @Autowired
    private QuestionRepository questionRepository;

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private TagRepository tagRepository;

    public void addQuestion(QuestionDTO dto) {
        Tag tag = null;
        User user = null;
        Question question = null;

        Set<Tag> tags = null;

        tag = tagRepository.findById(dto.getTag());

        tags = new HashSet<>();
        tags.add(tag);

        user = userRepository.findById(dto.getUser());

        question = new Question();
        question.setTag(tags);
        question.setUser(user);
        question.setId(dto.getId());
        question.setBody(dto.getBody());
        question.setTitle(dto.getTitle());
        question.setViewCount(dto.getViewCount());
        question.setAnswerCount(dto.getAnswerCount());
        question.setDateCreated(dto.getDateCreated());

        questionRepository.save(question);

    }
}

注意: QuestionTag 之间的关系是OneToMany 你必须使用Collection 类型。

关于java - 使用 Hibernate 在外键字段中插入空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54914807/

相关文章:

java - 根据其内容访问基于 td 元素的表中的行

java - 如何从 Java 中释放 Informix 锁

java - 如何在 EDT 上运行 JOptionPane?

java - 远程处理案例中的惰性/急切加载策略 (JPA)

php - Mysql 连接两个 Id 以获得用户名

java - 已选择忽略此运行时异常 java.lang.UnsupportedOperationException

mysql - Django 和 MySQL unicode 错误

mysql - 创建另一个表只是为了存储一些选项?

java - 批处理在 Spring+Hibernate+JPA 中内存不足

java - 如何在 spring 和 hibernate 中将组合键从 Controller 传递到 jsp ?