JPA的OneToMany和ManyToOne

在appfuse2下写个测试,用到了一对多,看看了资料,开整,commoneclipse插件已经装好,就等把pojo写好以为就OK了,第一次运行mvn compile hibernate3:hbm2ddl,报个什么net错误,一想,哦,mysql用的绿色的,每次还要手动启动服务,然后,还是报错,这次是报一个pojo里的一个属性是未知类型,一想,哦,hibernate.cfg.xml里加载pojo的顺序是不是也要好好写一下呢,不然,先编译“Many”方,“One”方还没有呢,是不是就这样才报错了呢?调整顺序试了试,还是不行,还是未知的属性。
昨天做电子方面的同学拿我的java书也开始学编程了,照着书上敲最简单的一个程序,输出java的基本数据类型,但是就是输不出来,一会这儿错一会那儿错,五花八门,无所不有,我在忙自己的事随口就说他肯定是没有按照书上的敲,肯定是敲错了,但是问题还是没有解决,因为他一口咬定没有敲错,就是按照书上敲的,后来过去看了下,原来他的按照书上敲是敲了,但是没有敲在main方法里面,正好那书翻了一页,他就敲方法外面,没有方法调用,自然没有输出了。
我就开始想这个问题,别人就是这样做的,pdf的教程里也是这么写的,为什么就出错了,为什么就报没有这个属性呢?原因一,我写的不对,犯了低级错误;原因二,我理解的不对,写出了错误的代码。检查了几遍,肯定是第二个原因了。再仔细看看书。

@OneToMany(
fetch = FetchType.LAZY,mappedBy = "company_id")
public List<Message> getMessages() {
return messages;
}

就是报这个company_id是未知属性,按照我的理解,在Message里有

private Company company;

应该是Message拿Company的ID做外键,那么mappedBy="company_id"就理所当然了。但是它却报错了,说这个属性未知,那么,这个里面的值并不是作为取Company的每个字段,应该是取Message的一个属性,那么就应该是

@OneToMany(
fetch = FetchType.LAZY,mappedBy = "company")
public List<Message> getMessages() {
return messages;
}

因为在Message里定义了

private Company company;

mappedBy的值应该是“Many”需要的“One”的属性,又仔细看了下JPA的文档,果然,原来这么久以来还真的是自己理解错了。
总结下,实践是检验真理的唯一标准。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我能理解你的问题,您想知道如何在JPA 2.2.10 SQL查询中使用Dto @OneToMany。在JPA中,@OneToMany关系表示一个实体具有多个子实体。Dto(Data Transfer Object)用于在不同层之间传输数据。要在SQL查询中使用Dto @OneToMany,请遵循以下步骤: 1. 创建Dto类和其对应的子Dto类。 2. 在Dto类中使用@OneToMany注释来指定实体类和关联属性。 3. 在SQL查询中使用JOIN语句来连接Dto和相关的实体类。 4. 通过使用GROUP BY子句和构造函数表达式将结果转换为Dto对象。 下面是一个示例: ``` @Entity public class ParentEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY) private List<ChildEntity> children; // getters and setters } @Entity public class ChildEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @ManyToOne(fetch = FetchType.LAZY) private ParentEntity parent; // getters and setters } public class ParentDto { private Long id; private String name; private List<ChildDto> children; public ParentDto(Long id, String name, List<ChildDto> children) { this.id = id; this.name = name; this.children = children; } // getters and setters } public class ChildDto { private Long id; private String name; public ChildDto(Long id, String name) { this.id = id; this.name = name; } // getters and setters } String sql = "SELECT p.id, p.name, c.id, c.name FROM ParentEntity p JOIN p.children c"; List<Object[]> resultList = entityManager.createQuery(sql).getResultList(); Map<Long, ParentDto> parentMap = new HashMap<>(); for (Object[] result : resultList) { Long parentId = (Long) result[0]; String parentName = (String) result[1]; Long childId = (Long) result[2]; String childName = (String) result[3]; ParentDto parent = parentMap.get(parentId); if (parent == null) { parent = new ParentDto(parentId, parentName, new ArrayList<>()); parentMap.put(parentId, parent); } parent.getChildren().add(new ChildDto(childId, childName)); } List<ParentDto> parentDtos = new ArrayList<>(parentMap.values()); ``` 希望这能回答您的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值