中国各大网站软件营销网站建设
web/
2025/10/9 7:59:55/
文章来源:
中国各大网站,软件营销网站建设,中国风网站表现,动漫设计专业哪个学校比较好jpa语法错误根据我在帮助团队和进行培训方面的经验#xff0c;这是我遇到的一些陷阱/错误#xff0c;它们在使用JPA的基于Java的系统中引起了一些问题。 需要一个公共的无参数构造函数 始终使用双向关联/关系 将OneToMany用于可能庞大的集合 需要一个公共的无参数构造函数… jpa语法错误 根据我在帮助团队和进行培训方面的经验这是我遇到的一些陷阱/错误它们在使用JPA的基于Java的系统中引起了一些问题。 需要一个公共的无参数构造函数 始终使用双向关联/关系 将OneToMany用于可能庞大的集合 需要一个公共的无参数构造函数 是的JPA Entity需要零参数或默认的无参数构造函数。 但这可以得到protected 。 您不必将其public 。 这样就可以实现更好的面向对象的建模因为您不必强制使用可公开访问的零参数构造函数。 实体类必须具有无参数构造函数。 实体类也可以具有其他构造函数。 no-arg构造函数必须是public 或protected 。 [强调我的] –摘自Java Persistence API 2.1规范Oracle的2.1节 如果要建模的实体在创建时有一些字段需要初始化则应通过其构造函数来完成。 注意一些JPA提供程序可以通过在构建时添加一个无参数的构造函数来克服缺失的无参数构造函数。 假设我们正在建模酒店房间预订系统。 在其中我们可能有诸如房间预订等之类的实体。预订实体可能需要开始日期和结束日期因为没有停留时间来创建一个预订实体就没有多大意义。 在保留的构造函数中将开始日期和结束日期作为参数包括在内将可以提供更好的模型。 保留受保护的零参数构造函数会使JPA满意。 Entity
public class Reservation { ...public Reservation(RoomType roomType, DateRange startAndEndDates) {if (roomType null || startAndEndDates null) {throw new IllegalArgumentException(...);} ...}...protected Reservation() { /* as required by ORM/JPA */ }
} 注意 HibernateJPA提供程序允许将零参数构造函数设为私有。 这使您的JPA代码不可移植到其他JPA提供程序。 它还有助于在零参数构造函数中添加注释以表明它是出于JPA目的技术基础结构而添加的并且不是域所必需的业务规则/逻辑。 尽管我在JPA 2.1规范中找不到它但可嵌入类也需要一个默认无参数构造函数。 就像实体一样可以将必需的无参数构造函数设为protected 。 Embeddable
public class DateRange { ...public DateRange(Date start, Date end) {if (start null || end null) {throw new IllegalArgumentException(...);}if (start.after(end)) {throw new IllegalArgumentException(...);} ...}...protected DateRange() { /* as required by ORM/JPA */ }
} DDD示例项目还通过将no-arg构造函数设置为包范围来隐藏no-arg构造函数请参阅Cargo实体类其中no-arg构造函数位于底部附近。 始终使用双向关联/关系 JPA上的教学材料通常显示出双向关联。 但这不是必需的。 例如假设我们有一个包含一个或多个项目的订单实体。 Entity
public class Order {Id private Long id;OneToMany private ListOrderItem items;...
}Entity
public class OrderItem {Id private Long id;ManyToOne private Order order;...
} 很高兴知道JPA支持双向关联。 但是实际上这成为维护的噩梦。 如果订单项不必知道其父订单对象则单向关联就足够了如下所示。 ORM只需要知道如何命名多边表中的外键列。 通过在关联的一侧添加JoinColumn批注来提供此功能。 Entity
public class Order {Id Long id;OneToManyJoinColumn(nameorder_id, ...)private ListOrderItem items;...
}Entity
public class OrderItem {Id private Long id;// ManyToOne private Order order;...
} 由于OrderItem不再需要保留对Order实体的引用因此使其变得单向变得更容易。 请注意有时可能需要双向关联。 实际上这种情况很少见。 这是另一个例子。 假设您有几个引用国家/地区实体的实体例如人的出生地邮寄地址等。 显然这些实体将引用国家实体。 但是国家是否必须引用所有这些不同的实体 很有可能不是。 Entity
public class Person {Id Long id;ManyToOne private Country countryOfBirth;...
}Entity
public class PostalAddress {Id private Long id;ManyToOne private Country country;...
}Entity
public class Country {Id ...;// OneToMany private ListPerson persons;// OneToMany private ListPostalAddress addresses;
} 所以仅仅因为JPA支持双向关联 并不意味着你必须 使用 假设您正在建模银行帐户及其交易。 随着时间的流逝一个帐户可以进行数千甚至数百万笔交易。 Entity
public class Account {Id Long id;OneToManyJoinColumn(nameaccount_id, ...)private ListAccountTransaction transactions;...
}Entity
public class AccountTransaction {Id Long id;...
} 对于只有少量交易的帐户似乎没有任何问题。 但是随着时间的流逝当一个帐户包含成千上万个如果不是上百万个交易时您很可能会遇到内存不足的错误。 那么有什么更好的映射方法呢 如果不能确保关联的多面中的最大元素数都可以全部加载到内存中则最好在ManyToOne的另一侧使用ManyToOne 。 Entity
public class Account {Id Long id;// OneToMany private ListAccountTransaction transactions;...
}Entity
public class AccountTransaction {Id Long id;ManyToOneprivate Account account;...public AccountTransaction(Account account, ...) {...}protected AccountTransaction() { /* as required by ORM/JPA */ }
} 要检索一个帐户可能数千如果不是几百万的交易请使用支持分页的存储库。 Transactional
public interface AccountTransactionRepository {PageAccountTransaction findByAccount(Long accountId, int offset, int pageSize);...
} 要支持分页请使用Query对象的setFirstResult(int)和setMaxResults(int)方法。 摘要 我希望这些说明可以帮助开发人员避免犯这些错误。 总结一下 要求公众。 JPA要求的无参数构造函数可以设为public或protected 。 如果需要可以考虑对其进行protected 。 一直使用 考虑单向而不是双向关联/关系。 使用 避免使用OneToMany收集可能庞大的集合。 考虑ManyToOne映射关联/关系的ManyToOne端并支持分页。 翻译自: https://www.javacodegeeks.com/2016/02/jpa-pitfalls-mistakes.htmljpa语法错误
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/89519.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!