有没有办法在 hibernate 的持久性映射中使用Flyweight对象?我的数据模型包含许多相同的对象。与其为每个相同的对象提供一个单独的实例,我不希望使用Flyweight设计模式并始终引用相同的物理对象。如何在 hibernate 状态下实现?
顺便提一句。所有的JVM是否以某种方式优化字符串的使用,以便当多次使用同一字符串时,它始终是相同的物理实例?
最佳答案
这取决于。
对于只读值,您可以通过创建自定义UserType来轻松实现flyweight模式,该自定义UserType将每次从池而不是新实例返回对象。
对于实体来说,默认情况下,Hibernate是理智的,并且希望在事务之间保持一致,因此不会在Session之间共享实体,以避免数据的竞争状况-我认为这不是您想要的。
但是,如果确实是这样(并且在不真正知道您在做什么的情况下完全不建议这样做),则可以实现Interceptor.getEntity(),以用于第二级缓存。在这种方法中,您可以返回一个实体(甚至是其他 session 共享的实体),并且您将有效地为实体设置一个flyweight模式。
但是,我强烈建议您这样做,以确保数据的一致性-更好地让实体引用实际的不可变flyweight值,而不是尝试对实际实体进行flyweight。
关于java - hibernate 和苍蝇,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1814329/