- 博客(13)
- 收藏
- 关注
原创 JPA可以方法进行注释
标准用例--您需要一个器,以便在每次更新/插入/删除时执行一些代码。例如,用于审计。但是,如果您需要侦听器中的Spring依赖,并且您正在使用JPA,那么事情就不那么简单了。首先,只有侦不够的JPA可以用@PreUpdate对方法进行注释,但上下文中最多的是它所涉及的实体能需要旧的价值观。或实体的提取ID。或者其他元数据。所有这些都不为JPA所支持。因此,您需要实现Hibernate接口,如PreDeleteEventListener、PreUpdateEventListener、PostInsertE
2021-10-17 18:10:58
230
原创 默认情况下都是懒惰jar
Hibernate(实际上是JPA)具有集合映射:@OneToMany、@ManyToMany、@ElementCollection。所有这些在默认情况下都是懒惰的。这意味着集合是列表或SET接口的特定实现,它们保存对持久会话的引用,并且只有在访问集合时才从数据库加载值。如果只是偶尔使用集合,则可以节省不必要的数据库查询。然而,这有一个问题。在我的观察中,这个问题是第二常见的异常(仅次于NullPointerException)--LazyInitializationException。问题是会话通常是
2021-10-15 18:35:29
100
原创 Java标签所逻辑答
一个简短的总结:有的用户,我刚刚提供了我的第5000个答案。在Java标签中排名第三。但是我已经够了--堆叠溢出有什么好酷的,以至于它很快就成为了最受欢迎的问答网站?很多事情。我没有改变我后来表达的观但是从有经验的用户的角度来看,这里有一些更多的细节:学习--有些问题你无法回答,当你看到别人的答案时,你会学到一些新的东西。在回答之前,有一些你研究过的问题,所以你可以提高你的知识。为什么人们会问一些他们也可以研究的问题?因为您有更高水平的通用编程知识,可以让您查看正确的位置并找到信息。即使你已经知道了答案
2021-10-15 00:10:18
99
原创 JPA和领域驱动的设计
JPA和领域驱动的设计不能很好地结合在一起。事实上,JPA“实体”是Fowler警告所反对的贫血数据模型的代表。我已经讨论过因此,我不会在这里详细介绍贫血数据模型是否不好(请记住:我不认为它是坏的)。但是,对于需要将依赖项注入实体的时间,标准不会帮助您。唯一的选择是@Configable,这需要AspectJ编织,这对我来说是“黑魔法”。那么,为什么不能将依赖项注入实体呢?因为它们是由您创建的,而不是由依赖注入框架创建的。好吧,有个奇怪的主意。如果JPA 3有EntityManager.create
2021-10-07 13:42:55
245
原创 JSF问题的解决
我花了相当长的时间试图找到以下JSF问题的解决方案:不可能在java.util-Set上迭代。-UI:重复(Facelets)不起作用-A4j:重复(富面孔)不起作用-c:forEach工作.只有在不依赖父组件定义的变量的情况下(例如,rich:dataTable)所有这些都是相当合乎逻辑的现象,因为UIData依赖于有序的数据,而且通常一个集合是不有序的。在我的例子中,我必须使用Hibernate(JPA)对象(PersistentSet)中定义的集合。一个重要的注意事项:您应该使用一个集
2021-09-26 15:29:32
143
原创 代码工作所必需的工程
从更广的意义上讲,偶然的复杂性是开发人员添加到代码中的复杂性,而这并不是代码工作所必需的。这可能包括过度工程、过度使用设计模式、工具、框架和范例的选择不当,以难以理解的方式编写代码片段。例如,如果您可以使使用微服务(并且必须决定粒度、协调它们等等)。或者消息驱动的体系结构(设置代理及其队列的各种配置)不必要地增加了软件的复杂性,因此是偶然的复杂性。如果您想解析XML并将其隐藏到对象中,那么使用SAX与XML到对象映射程序(例如JAXB)相比,使用SAX会增加许多意外的复杂性,在这种情况下,您只需要添加一些注
2021-09-25 19:28:24
121
原创 2021-09-20
许多库封装了一些外部通信。无论是类似REST的API、消息队列、数据库、邮件服务器还是其他什么。因此,你必须有一些时间-连接,阅读,写作或空转。遗憾的是,许多库的默认超时设置为“0”或“-1”,这意味着“无穷大”。这是一个非常无用甚至有害的违约。没有一个实际的用例,您希望永远等待一个资源。在很多情况下,这种情况可能会发生,例如,另一端会卡住。在过去的3个月中,我有两个库,它们的默认超时为“无穷大”,这最终会导致生产问题,因为我们忘记了正确配置它们。有时你甚至看不到问题,直到线程池耗尽。因此,我向AP
2021-09-20 20:19:59
56
原创 某种形式的(web/RESTful)API
可能您正在开发某种形式的(web/RESTful)API,如果它是面向公众的(或者即使它是内部的),您通常希望对它进行某种程度的分级限制。也就是说,限制在一段时间内执行的请求数量,以节省资源和防止滥用。这可能可以通过一些巧妙的配置在web服务器/负载均衡器级别上实现,但通常您希望速率限制器是特定于客户端的(即您的api sohuld的每个客户端都有一个单独的速率限制),并且客户端的识别方式也各不相同。在负载均衡器上可能仍然可以这样做,但我认为在应用程序级别上这样做是有意义的。我将使用SpringMV
2021-09-18 11:12:07
100
原创 利用Java实现可信时间戳
由可信的第三方(“时间加盖权”,TSA)以电子形式认证给定事件的时间的过程。欧盟法规eIDAS赋予了这些时间戳法律力量--也就是说,任何人都不能对事件的时间或内容提出异议,如果它是时间戳的话。它适用于多种场景,包括时间戳审计日志。(注:时间戳对于良好的审计跟踪是不够的,因为它不能阻止恶意参与者完全删除事件)可信时间戳有许多标准,核心标像大多数射频控制器一样,它很难读懂。幸运的是,对于Java用户来说,Bouncy城堡实现了这个标准。不幸的是,与大多数安全API一样,使用它是很困难的,甚至是非常糟糕的。我
2021-09-12 22:04:04
562
原创 2021-09-02
你可能认为你有圆木。很可能,您只能在跟踪异常和调试时依赖它们。但你不能依赖他们的遵从,法医,或任何法律问题。作为一名工程师,这可能与你无关,但这是那些重要的非功能性要求之一,如果不满足,因为我我显然有偏见,也有资格讨论日志(我之前描述过虽然它们只是安全方面的一部分,当然也不是很令人兴奋,但它们是重要的,特别是从法律的角度来看。这就是为什么许多标准和法律--包括ISO 27001,PCI-DSS,HIPAA,SOC 2,PSD 2,GDPR--都需要审计跟踪功能。而且他们中的大多数都有非常特殊的安全要求。
2021-09-02 20:31:30
63
原创 Web应用程序都应该有多个用户
实际上,每个Web应用程序都应该有多个用户,每个用户都有一些数据--帖子、文档、消息等等。最明显的事情是保护这些实体不被那些不是这些资源的合法所有者的用户所获得。不幸的是,这不是最容易做的事。我不是说这很难,只是不像简单地返回资源那样直观。当你是你的/record/{recordId}端点,记录ID的数据库查询是您立即要做的事情。只有这样,才需要检查该记录是否属于当前通过身份验证的用户。框架在这里不会帮助您,因为这种访问控制和所有权逻辑是特定于域的。没有明显的通用方法来定义所有权。这取决于实体模型和
2021-08-30 14:13:51
163
原创 2021-08-25
有时,您没有PKI,但您仍然需要一个密钥和相应的证书来签署内容(在TLS上下文之外)。在最初生成的jks文件中的证书过期后,您几乎没有什么选项--要么生成一个全新的键区,要么以某种方式“扩展”现有的证书。这对于测试和内部系统非常有用,但仍然值得一提。扩展证书通常是不可能的--一旦证书过期,它们就完成了。但是,您可以使用相同的私钥和更长的时间获得新的证书。这听起来像是一件应该很容易做的事情,但它使它变得不那么容易了。即使用我最喜欢的工具,这不可能马上发生。为了重用私钥以获得新的、更长的证书,您需要执行
2021-08-25 21:19:02
50
原创 反射是最重要的JAVAAPI
有一天,我在想--这是最重要的JavaAPI。SE和EEAPI中的哪个使大多数Java生态系统成为可能,并且不可能仅仅作为第三方库重新创建。就像你可能猜到的那样-我想这。是的,它不可避免地成为每一个项目的一部分,直接或间接。但是,对于更多的API,尤其是Collection API,这是正确的。但是反射API的重要之处在于它启用了当今流行的大多数工具和框架--Spring,Hibernate,大量的Web框架。大多数其他API都可以在JDK之外实现。集合API很可能是共用-收集或番石榴。更好的做法是
2021-08-25 20:57:36
67
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人