小编RBz*_*RBz的帖子

创建完美的JPA实体

我一直在使用JPA(实现Hibernate)一段时间,每次我需要创建实体时,我发现自己正在努力解决AccessType,immutable属性,equals/hashCode等问题.
因此,我决定尝试找出每个问题的一般最佳实践,并将其写下来供个人使用.
但是我不介意任何人对此发表评论或告诉我哪里错了.

实体类

  • 实现Serializable

    原因:规范说你必须这样做,但是有些JPA提供商并没有强制执行.Hibernate作为JPA提供程序并不强制执行此操作,但如果未实现Serializable,它可能会因为ClassCastException而陷入困境.

构造函数

  • 创建一个包含实体所有必填字段的构造函数

    原因:构造函数应始终将创建的实例保持在合理的状态.

  • 除了这个构造函数:有一个包私有默认构造函数

    原因:默认构造函数需要让Hibernate初始化实体; 允许private,但是在没有字节码检测的情况下,运行时代理生成和高效数据检索需要包私有(或公共)可见性.

字段/属性

  • 一般情况下使用字段访问,需要时使用属性访问

    原因:这可能是最有争议的问题,因为对于其中一个(属性访问与字段访问)没有明确和令人信服的论据; 然而,由于更清晰的代码,更好的封装以及不需要为不可变字段创建setter,因此字段访问似乎是最受欢迎的

  • 省略不可变字段的setter(访问类型字段不需要)

  • 属性可能是私有的
    原因:我曾经听说受保护对于(Hibernate)性能更好,但我可以在网上找到的是:Hibernate可以直接访问公共,私有和受保护的访问器方法,以及公共,私有和受保护的字段.选择取决于您,您可以匹配它以适合您的应用程序设计.

等于/的hashCode

  • 如果仅在持久化实体时设置此ID,则永远不要使用生成的id
  • 优先级:使用不可变值来形成唯一的Business Key,并使用它来测试相等性
  • 如果唯一的业务密钥不可用,则使用在初始化实体时创建的非瞬态UUID ; 有关更多信息,请参阅此精彩文章.
  • 从不参考相关实体(ManyToOne); 如果此实体(如父实体)需要成为业务密钥的一部分,则仅比较ID.只要您使用属性访问类型,在代理上调用getId()将不会触发实体的加载.

示例实体

@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)

java hibernate jpa equals

410
推荐指数
4
解决办法
15万
查看次数

如何在Hibernate中使用BLOB数据类型?

我正在从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)

orm hibernate blob spring-mvc oracle10g

6
推荐指数
1
解决办法
2万
查看次数

用于存储 JSON 的 Oracle CLOB 替代方案

CLOB除了Oracle 10g之外,还有其他替代方案来存储大量数据吗?我需要在此字段中存储的 JSON 文件的最大大小是 150Kb。我可以使用VARCHAR2NTEXT用于此目的吗?如果需要避免使用 .JSON 文件,也可以将 JSON 文件的内容复制为文本CLOB。预先感谢您的任何帮助。

oracle json clob varchar2

5
推荐指数
1
解决办法
8375
查看次数

迁移到java 8时的Swing布局问题

我在java 5中的swing应用程序有一个像

这个

迁移到java 8后,放大并仅显示其中的一部分 这个

我看到了这个,并尝试将J2D_D3D设置为环境变量,并尝试将其作为vm参数传递.但没有解决问题.知道这可能是什么?

java swing rendering java-8

5
推荐指数
1
解决办法
269
查看次数

比较:JMX与JMS

我认为JMX是一个规范,JMS更像是一个实现.我被问到两者之间的区别,提问者不同意这一点.我读到了它,并且理解两者都是规格.并且看到"JMX是一个监控规范,而不是发布/订阅规范.您可以将其击败为发布/订阅模型,但这更像是JMS应该为您做的事情." 这到底是什么意思?它们的区别是什么,以及何时选择其中一个和两个.

java messaging jmx jms

5
推荐指数
1
解决办法
5458
查看次数

复制在记事本++中搜索到的所有行

我的数据库转储有一个巨大的文件,就像下面显示的小片段一样。

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)

search text copy notepad++

3
推荐指数
1
解决办法
7374
查看次数

CompleteExceptionally 和 obtrudeException 之间的区别

只是浏览CompletableFuture文档并偶然发现了completeExceptionallyobtrudeException方法,并且很难理解差异和用例。社区可以通过示例帮助理解差异和用例吗?

java multithreading asynchronous completable-future completion-stage

1
推荐指数
1
解决办法
3935
查看次数