我有一个问题,我知道,已被广泛讨论过,但在我看来,还有一个方面需要澄清.
我正在创建一个带有多语言数据库的Web应用程序,我已经找到了一些好的练习文章(例如 这个),这里的答案就像这样堆栈溢出.
所以我决定使用一个带有我的项目ID的主表和另一个带有每个项目翻译的表格,比方说,例如
Content
ContentTranslation
Run Code Online (Sandbox Code Playgroud)
要么
Category
CategoryTranslation
Run Code Online (Sandbox Code Playgroud)
等等.
现在我在做什么?我只是从数据库中获取所有翻译的项目,然后我迭代每一个,以根据当前用户的本地查找正确的翻译,如果我找到正确的本地我设置到主要对象,该页面的翻译渲染,否则我只是得到标记为"默认"的翻译.
但是,对于大量对象和翻译,服务器响应时间可能会增长,即使用户可能没有注意到,我也不希望这样.
那么,这个用例有没有好的做法呢?例如,一些特定的查询说"选择带语言环境的翻译",但是如果你没有找到它只是设置了一个"默认"标志?
现在,我正在使用Spring MVC和Hibernate以及JPA(通过JPARepository).
我的对象都扩展了我用这种方式创建的基本可翻译类
@MappedSuperclass
public abstract class Translatable<T extends Translation> extends BaseDTO {
private static final long serialVersionUID = 562001309781752460L;
private String title;
@OneToMany(fetch=FetchType.EAGER, orphanRemoval=true, cascade=CascadeType.ALL)
private Set<T> translations = new HashSet<T>();
@Transient private T currentLocale;
public void addLocale(T translation, boolean edit) {
if (!edit)
getTranslations().add(translation);
}
public void remLocale(String locale) {
T tr = null;
for (T candidate: getTranslations()) {
if (candidate.getLocale().equals(locale))
tr …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 sbt 子项目中开发一个播放框架应用程序。目录树如下所示:
- main-project
|--sub-project
| |--app
| |--conf
| |--logs
| |--public
| |--test
|--project
|--build.sbt
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用 sbt shell 和以下命令运行播放应用程序
sub-project/run
播放正确开始。但是,如果我尝试使用 IntelliJ 运行配置运行它,则会出现错误java.lang.RuntimeException: No main class detected.
遵循日志的第一行和 IJ 启动的命令:
/usr/java/jdk1.8.0_111/bin/java -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:41258,suspend=y,server=n -Dfile.encoding=UTF8 -Djline.terminal=none -Dsbt.log.noformat=true -Dsbt.global.base=/tmp/sbt-global-pluginstub -Xms512M -Xmx1024M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M -javaagent:/home/myusername/Programmi/idea-IU-173.3727.127/lib/rt/debugger-agent.jar=/tmp/capture.props -classpath /home/myusername/.IntelliJIdea2017.3/config/plugins/Scala/launcher/sbt-launch.jar:/home/myusername/Programmi/idea-IU-173.3727.127/lib/idea_rt.jar xsbt.boot.Boot "project sub-project" run
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256M; support was removed in 8.0
Connected to the target VM, address: '127.0.0.1:41258', transport: 'socket'
[warn] No sbt.version set in …Run Code Online (Sandbox Code Playgroud) 我正在使用 sbt 1.2.6 来编译我的项目。在我的本地机器编译运行良好,但是当使用 travis-ci 进行测试时,编译器抱怨value isBlank is not a member of String.
和这里的构建报告 https://travis-ci.com/LukeDS-it/webfleet-driver/builds/92441228
我没有更多信息可以提供。我的 IDE 说一切正常,如果我在本地运行编译或测试,一切正常。
我错过了什么?
我正在建立一种避免重复代码的框架,在某个时候,我需要将对象Foo的列表转换为对象Bar的列表。
我有扩展的数据库实体
public class BaseEntity {...}
Run Code Online (Sandbox Code Playgroud)
以及扩展的演示对象
public class BaseDTO<T extends BaseEntity> {...}
Run Code Online (Sandbox Code Playgroud)
所以
public class Foo extends BaseEntity {...}
Run Code Online (Sandbox Code Playgroud)
和
public class Bar extends BaseDTO<A extends BaseEntity> {
public Bar(Foo entity, Locale l) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
现在,使用流很容易将Foo列表转换为Bar列表
public abstract ClassThatUsesFooAndBar() {
public List<Bar> convertFooToBar(List<Foo> list) {
return list.stream().map(f -> new Bar(f, locale)).collect(...);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这里有个问题,这些Foo和Bar实际上是泛型(A和B),因此使用Foo和Bar的类实际上是ClassThatUsesAandB<A extends BaseEntity, B extends BaseDTO>,因此该函数也必须是抽象的,并以正确的A和B实现为样板代码实现,因为显然您无法实例化泛型类型。
有没有一种方法可以使用泛型/流/ lambdas创建可以编写一次的函数,从而使实现类无需重新实现它?函数签名为
public List<B> convertAToB(List<A> list);
Run Code Online (Sandbox Code Playgroud)
我希望我已经很清楚了,如果您需要进一步的解释,请询问
谢谢!