- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我认为这可能是我知道答案但只是不喜欢的情况。
我的出发点是之前的一个问题, Hibernate @Entity conflict with Spring @Autowired for non-column object .
我有一个@Entity,它“自然”地与另一组实体以一对多关系链接。在我的示例中,我将其称为 ItemEntity,并且它具有(非常)大的价格历史记录。如此之大,Hibernate 延迟加载会成为性能 killer ,因为真正的用例永远不需要所有历史记录(数十万的价格,而不是通常需要的几百)。因此,我有一个 PriceCache 服务,可以按需获取我需要的内容。
从正常用例来看,“自然”的事情是检索感兴趣的 ItemEntity,然后询问某个时间范围内的关联价格历史记录。正如上面的文章中所讨论的,在 ItemEntity 中拥有该服务是不正常的,尽管它可以完成并使其工作。
在下面的示例代码中,我以不同的方式编写了此代码,即使用一个 Item 接口(interface),以及一个实际上是 ItemEntity 和 PriceCache 服务代理的实现。这是示例代码,缺少位;我认为(希望)有足够多的证据可以让大家清楚。
我的实体集及其属性并不是很大,我无法手动为所有实体执行此操作;几十个实体,每个实体有 5-20 个属性。这将是相当痛苦和无聊的,但它应该有效。
但是...是否有一种更简单的方法来创建本质上是代理对象并注入(inject)额外服务的对象?或者也许问题是,是否有更懒惰的方法来做到这一点?
@Entity @Table(name="item")
public class ItemEntity {
@Id @Column(name="id")
private long id;
@Column(name="name")
private String name;
/* ... setters, getters ... */
}
@Service
public class ItemCache {
@Autowired
private ItemDAO itemDAO;
@Autowired
private PriceCache priceCache;
private Map<Long,Item> itemCache;
public ItemCache() {
itemCache = new HashMap<>();
}
public Item get(long id) {
if (itemCache.containsKey(id))
return itemCache.get(id);
ItemEntity itemEntity = itemDAO.find(id);
Item item = (itemEntity == null) ? null : new ItemImpl(itemEntity, priceCache);
itemCache.put(id, item); // caches nulls to avoid retry
return item;
}
}
@Service
public class PriceCache {
@Autowired
private PriceDAO priceDAO;
/* ... various cache/map structures to hold previous query results ... */
public PriceCache() {
/* ... initialize all those cache/map structures ... */
}
public Collection<Price> getPrices(long id, LocalDateTime begTime, LocalDateTime endTime) {
Collection<Price> results;
/* ... check the caches to see if we already have the data ... */
/* ... otherwise, use priceDAO to find it and save the results in the cache ... */
return results;
}
}
public interface Item {
public long getId();
public String getName();
public Collection<Price> getPrices(LocalDateTime begTime, LocalDateTime endTime);
}
public class ItemImpl implements Item {
public ItemImpl(ItemEntity underlying, PriceCache priceCache) { ... }
public long getId() {
return underlying.getId();
}
public String getName() {
return underlying.getName();
}
public Collection<Price> getPrices(LocalDateTime begTime, LocalDateTime endTime) {
priceCache.get(getId(), begTime, endTime);
}
}
最佳答案
所以......我猜每个人都很有礼貌,并且不想同意我正在寻找一种懒惰的出路:-)
对于上面的示例,我没有这样做,但我有另一个类似的情况,我想要的本质上是一个添加了一些服务的 bean。我没有编写代理等,而是将提供服务的对象制作为派生对象。它不是 @Entity,而是纯粹根据 applicationContext.xml 描述创建的 @Component。
所以有四个部分;描述对象的 bean、使用/扩展描述并提供注入(inject)服务的“真实”业务对象,以及从描述查找并创建这些业务对象的缓存服务。
或多或少像下面这样。这是经过精简和即时编写的,因此可能有拼写错误;真正的代码和想法是有效的。
@Component
public class ThingDescr {
/* ... various attributes, setters, getters, just a bean ... */
}
public class Thing extends ThingDescr implements HelperService {
public Thing(ThingDescr td, HelperService svc) {
/* ... basically a copy constructor ... */
}
@Override
public void doSomething() {
/* ... whatever HelperService is supposed to do ... */
}
}
public interface HelperService {
public void doSomething();
}
@Service
public class ThingCache {
@Autowired
private HelperService svc;
@Autowired
private List<? extends ThingDescr> thingList;
private Map<String,Thing> thingMap;
private void load() {
thingMap = new HashMap<>();
for (ThingDescr td : thingList) {
Thing thing = new Thing(td, svc);
thingMap.put(thing.getName(), thing);
}
public getThing(String name) {
if (thingMap == null || thingMap.isEmpty())
load();
return thingMap.get(name);
}
}
此模式的主要优点是业务对象“Thing”继承底层对象的所有属性,而无需编写它们。我没有这样做,但我认为如果属性应该是只读的,那么“ThingDescr”中的 setter 可以受到保护,以便“Thing”可以访问它们,但该类的用户不能。
关于java - Spring 和 Hibernate 混搭,是 @Entity 的代理对象,并添加了额外的 @Service,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60856510/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!