我一直在使用JPA(实现Hibernate)一段时间,每次我需要创建实体时,我发现自己正在努力解决AccessType,immutable属性,equals/hashCode等问题.
因此,我决定尝试找出每个问题的一般最佳实践,并将其写下来供个人使用.
但是我不介意任何人对此发表评论或告诉我哪里错了.
实现Serializable
原因:规范说你必须这样做,但是有些JPA提供商并没有强制执行.Hibernate作为JPA提供程序并不强制执行此操作,但如果未实现Serializable,它可能会因为ClassCastException而陷入困境.
创建一个包含实体所有必填字段的构造函数
原因:构造函数应始终将创建的实例保持在合理的状态.
除了这个构造函数:有一个包私有默认构造函数
原因:默认构造函数需要让Hibernate初始化实体; 允许private,但是在没有字节码检测的情况下,运行时代理生成和高效数据检索需要包私有(或公共)可见性.
一般情况下使用字段访问,需要时使用属性访问
原因:这可能是最有争议的问题,因为对于其中一个(属性访问与字段访问)没有明确和令人信服的论据; 然而,由于更清晰的代码,更好的封装以及不需要为不可变字段创建setter,因此字段访问似乎是最受欢迎的
省略不可变字段的setter(访问类型字段不需要)
@Entity
@Table(name = "ROOM")
public class Room implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
@Column(name = "room_id")
private Integer id;
@Column(name = "number")
private String number; //immutable
@Column(name = "capacity")
private Integer capacity;
@ManyToOne(fetch = FetchType.LAZY, optional = …
Run Code Online (Sandbox Code Playgroud) 我正在从Oracle 10g数据库中检索包含JSON文件的blob字段.我想将它转换为我的DAO中的字符串并将其转发给传入的服务请求.我的实体类是:
@Lob
@Column(name = "DTA_BLOB")
private Blob DataBlob;
/**
* @return the DataBlob
*
*/
public Blob getDataBlob(){
return DataBlob;
}
/**
* @param DataBlob the DataBlob to set
*/
public void setDataBlob(Blob DataBlob) {
this.DataBlob = DataBlob;
}
Run Code Online (Sandbox Code Playgroud)
我的DAO有从blob获取字符串的方法,如下所示:
@Override
@Transactional
public String getMenu(Long menuDataId) throws SQLException, IOException{
MenuData menu_data = this.entityManager.find(MenuData.class,menuDataId);
Blob menuData =menu_data.getDataBlob();
byte[] bdata = menuData.getBytes(1, (int)menuData.length());
String dataStr = new String(bdata);
return dataStr;
}
Run Code Online (Sandbox Code Playgroud)
但是当我在部署此WAR之后尝试访问该服务时,我收到一个错误(并且我的tomcat崩溃了).在日志中它说:
Nov 06, 2014 3:47:34 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() …
Run Code Online (Sandbox Code Playgroud) CLOB
除了Oracle 10g之外,还有其他替代方案来存储大量数据吗?我需要在此字段中存储的 JSON 文件的最大大小是 150Kb。我可以使用VARCHAR2
或NTEXT
用于此目的吗?如果需要避免使用 .JSON 文件,也可以将 JSON 文件的内容复制为文本CLOB
。预先感谢您的任何帮助。
我在java 5中的swing应用程序有一个像
迁移到java 8后,放大并仅显示其中的一部分
我看到了这个,并尝试将J2D_D3D设置为环境变量,并尝试将其作为vm参数传递.但没有解决问题.知道这可能是什么?
我认为JMX是一个规范,JMS更像是一个实现.我被问到两者之间的区别,提问者不同意这一点.我读到了它,并且理解两者都是规格.并且看到"JMX是一个监控规范,而不是发布/订阅规范.您可以将其击败为发布/订阅模型,但这更像是JMS应该为您做的事情." 这到底是什么意思?它们的区别是什么,以及何时选择其中一个和两个.
我的数据库转储有一个巨大的文件,就像下面显示的小片段一样。
903 09-JAN-14 4 2 "false" "false" "false" 7505 7459 2139 66.51 0.18 69.72 1
903 09-JAN-14 5 3 "false" "false" "false" 7468 7415 2173 66.24 0.37 70.19 4
860 17-FEB-13 1 1 "false" "false" "false" 7014 6973 2371 67.21 0.97 68.31 16
860 17-FEB-13 2 2 "false" "false" "false" 6992 6954 2401 66.95 0.62 68.78 8
891 10-DEC-13 1 1 "false" "false" "false" 1010 1001 10965 17.75 11.3 71.49 505
903 17-DEC-13 5 3 "false" "false" "false" 7468 7415 …
Run Code Online (Sandbox Code Playgroud) 只是浏览CompletableFuture
文档并偶然发现了completeExceptionally
和obtrudeException
方法,并且很难理解差异和用例。社区可以通过示例帮助理解差异和用例吗?
java multithreading asynchronous completable-future completion-stage