【问题标题】:Can't see the owning side from an inverse side JPA Hibernate从反面JPA Hibernate看不到拥有方
【发布时间】:2020-11-23 00:21:17
【问题描述】:

我有这段代码:

@Entity(name = "Person")
@Table(name = "person")
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany( mappedBy = "person", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<Post> posts = new ArrayList<Post>();
}

和:

@Entity(name = "Post")
@Table(name = "post")

public class Post extends BaseEntity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne(
        fetch = FetchType.LAZY
)
@JoinColumn(name="person_id")
Person person;
@Column(name = "text", nullable = true)
private String text;
}

问题是当我连接到我的 Hibernate 数据库时,我可以在 Post 实体中看到 Person Id,但在 Person 实体中看不到 Post id。也没有 person_post 表。如何查看属于此人的帖子?我想列出使用百里香叶的人的帖子,但这样的东西不起作用:

  <tr th:each="post : ${person.posts}">
            <td th:text="${post.text}">nothing in here</td>
 </tr>

错误说 thymeleaf 看不到 Person 中的帖子。这是它应该如何工作的吗?如何列出人员的帖子? 在此先感谢 Tomasz

【问题讨论】:

    标签: java sql spring hibernate jpa


    【解决方案1】:

    您正在定义一个 1:N 关系商店,这意味着在 Post 表中有 person_id 外键,但没有中间表 person_post。但是 person.posts 应该给你你正在寻找的结果 - 你能添加你如何添加 Person / Post 和模板的控制器方法的逻辑吗?

    建议用户LAZY fetching,顺便提一下:https://vladmihalcea.com/eager-fetching-is-a-code-smell/

    【讨论】:

    • 嗨,我有一个运行器类 @Component public class Runner 实现 ApplicationListener 我把数据放在哪里: Post firstPost = new Post(); firstPost.setText("这是第一篇文章");发布 secondPost = new Post(); secondPost.setText("这是第二篇文章");人人 = 新人(); firstPost.setPerson(person); secondPost.setPerson(person); person.getPosts().add(firstPost); person.getPosts().add(secondPost);
    • 有趣的是,当我在这个 Runner 类中运行 person.getPosts().size() 时,它返回 2,这是正确的。但是在数据库中它不能从人那里检索帖子。
    • 从你提到的代码来看,没有repository.save(entity)调用?你可以看看bootify.io(用休息控制器创建你的实体)来看看这个保存部分是如何工作的。
    • 所有这些新类实例的创建都在方法 getPersons() 中被调用:@Override public void onApplicationEvent(ContextRefreshedEvent event) { personRepository.saveAll(getPersons());并且 PersonRepository 看起来像这样: public interface PersonRepository extends CrudRepository { }
    • 数据库中是否创建了 Post?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多