我知道这可能是一个古老的问题,但更好的做法是什么?在应用程序的所有层中使用域模型对象,甚至在JSP上直接将值绑定到它们(我使用的是JSF).或者将域模型对象转换为DAO或服务层中的DTO,并将轻量级DTO发送到表示层.
我被告知使用DTO是没有意义的,因为对数据库的更改将导致所有DTO的更改,而在任何地方使用模型对象只需要更改受影响的模型对象.然而,DTO的易用性和轻量级特性似乎超过了这一点.
我应该注意我的应用程序使用Hibernate模型对象并使用自己的自定义创建的模型对象(意味着没有绑定到任何数据库会话,总是分离).以上任一方案对严格的模型对象模式更有利吗?对于像Lazy Initialization Exceptions这样的事情,使用Hibernate是一个巨大的PITA.
我正在编辑这个问题,希望能够进一步讨论(不确定我是否正确行事):
我对模型对象的问题在于它们根本不灵活.下面的评论说应该设计应用程序,以便可以在所有层中使用模型对象.为什么?如果用户想要一个荒谬的功能,我应该告诉他们,"好吧,这对模型对象不起作用"?
简单而简单,有时候模型对象不起作用.你可能有:
public class Teacher {
List<Student> students;
[tons of other Teacher-related fields]
}
public class Student {
double gpa;
[tons of other Student-related fields]
}
Run Code Online (Sandbox Code Playgroud)
但也许你不需要所有这些信息.您只需要教师的姓氏,他们今年教授的学生人数,以及所有学生的平均GPA.在那种情况下你会做什么?检索完整的教师信息和学生关系,然后您的代码计入学生列表,然后计算内部所有gpas的总平均值?这似乎比简单地使用'String lastName','int numStudents'和'double combinedGpa'创建DTO更加努力;
听起来好像我已经考虑到了这些,但我还没有在一个应用程序中工作,在这个应用程序中,模型对象可以在每个实例中完全使用.具有不同寻常的用户需求的常规实际应用程序不能以这种方式工作.
我试图简单地测试JLS保证的最终字段的初始化安全性.这是我写的一篇论文.但是,根据我当前的代码,我无法让它"失败".有人可以告诉我我做错了什么,或者这只是我必须反复运行然后看到一个不幸的时机失败?
这是我的代码:
public class TestClass {
final int x;
int y;
static TestClass f;
public TestClass() {
x = 3;
y = 4;
}
static void writer() {
TestClass.f = new TestClass();
}
static void reader() {
if (TestClass.f != null) {
int i = TestClass.f.x; // guaranteed to see 3
int j = TestClass.f.y; // could see 0
System.out.println("i = " + i);
System.out.println("j = " + j);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的线程正在调用它:
public class TestClient {
public static void …
Run Code Online (Sandbox Code Playgroud) 除了更少的代码之外,使用Hibernate Criteria API构建IN子句的以下两种方法之间的区别是什么?是否存在性能问题?我缺少的检索中是否有一些逻辑?就返回的行而言,它们似乎都执行相同的操作.
Disjunction disj = Restrictions.disjunction();
for (String value : stringArray) {
disj.add(Restrictions.eq("code", value));
}
where.add(disj);
Run Code Online (Sandbox Code Playgroud)
VS.
Restrictions.in("code", stringArray);
Run Code Online (Sandbox Code Playgroud)
我问的原因是因为我在前者存在的情况下重构遗留代码,但我期待后者.如果它们都是相同的,我将单独保留遗留代码.
我今天意识到我已经盲目地按照这个要求多年没有真正问过为什么.今天,我遇到了一个NotSerializableException和我从头开始创建的模型对象,我意识到足够了.
我被告知这是因为负载均衡服务器之间的会话复制,但我知道我在会话范围内看到了其他没有实现Serializable的对象.这是真正的原因吗?
我正在我的系统中创建域模型.在设计模型对象时,我应该为每个实体对象创建接口吗?人们告诉我,我们的Web层不应该关心实体的实现,我们应该能够交换实现,但我不确定是否会发生.
例如,如果我们有一个维护学生列表的Teacher类,则getStudents方法可以是:
public List<Student> getStudents() {
return this.students;
}
Run Code Online (Sandbox Code Playgroud)
或这个:
public List<Student> getStudents() {
return someExternalService.retrieveStudents();
}
Run Code Online (Sandbox Code Playgroud)
我理解这个好处,但一般做法是什么?
AWS 声称支持存储库上的命名空间规则,但我不\xe2\x80\x99 不遵循你应该如何设置它们。根据这里的文档:
\n\n\n存储库名称可以支持命名空间,您可以使用命名空间对相似的存储库进行分组。例如,如果有多个团队使用相同的注册表,则团队 A 可以使用 team-a 命名空间,而团队 B 使用 team-b 命名空间。每个团队都可以拥有自己的名为\nweb-app 的映像,但由于它们均以团队名称空间为前缀,\n这两个映像可以同时使用而不会相互干扰。团队 A 的映像将称为 team-a/web-app,而团队 B 的映像将称为 team-b/web-app。
\n
所以我们在注册表中创建了一个存储库<registry ID>.dkr.ecr.<region>.amazonaws.com/mycompany/myproj
基于此,我希望能够在此myproj
名称空间中存储多个图像,例如:
<registry ID>.dkr.ecr.<region>.amazonaws.com/mycompany/myproj/imageone:latest
<registry ID>.dkr.ecr.<region>.amazonaws.com/mycompany/myproj/imagetwo:latest
但是,当我尝试推送这些图像之一时,它告诉我该存储库mycompany/myproj/imageone
不存在。我不知道为什么它认为这imageone
是我的存储库名称的一部分,而不是我的图像名称:标签的一部分。我的存储库命名方式或图像命名/标记方式是否有问题?
无论如何使用Angular UI路由器为每个路由指定默认参数?
通过选择用户然后导航到我的应用程序,我的应用程序通过另一个应用程序的上下文输入.我的应用程序中的URL将始终在URL中具有用户ID,以便人们可以为URL添加书签,通过电子邮件发送等等.因此,当您浏览时,URL始终遵循以下方案:
#/{userId}/view/...
#/{userId}/edit/...
Run Code Online (Sandbox Code Playgroud)
等等
对于他们前往的任何路线,此appId对于应用内部的用户始终是相同的.如果他们碰巧退出,请返回主应用程序,选择一个新用户并返回我的应用程序,此userId将更改,但每个路径的值将相同.
无论如何从服务/工厂读取这个值,然后将其插入每个路由?
编辑:
我应该提一下,当我导航到一个状态时,我想避免在每个路由上显式设置此参数.例如,我不希望ui-sref="new-state({userId : blah})"
每次导航到新状态时都要这样做.userId永远不会在我的应用程序的上下文中更改.
再次编辑:
我实际上是以不同的方式讨论了不必手动向每条路线发送'userId'的要求.我使用$ provide.decorator将此功能添加到'go'方法,而不是使用指令.我在下面添加了一个答案.
我使用Spring的NamedParameterJdbcTemplate来执行对表的插入.该表在序列上使用NEXTVAL来获取主键.然后,我希望将生成的ID传回给我.我正在使用Spring的KeyHolder实现,如下所示:
KeyHolder key = new GeneratedKeyHolder();
jdbcTemplate.update(Constants.INSERT_ORDER_STATEMENT, params, key);
Run Code Online (Sandbox Code Playgroud)
但是,当我运行此声明时,我得到:
org.springframework.dao.DataRetrievalFailureException: The generated key is not of a supported numeric type. Unable to cast [oracle.sql.ROWID] to [java.lang.Number]
at org.springframework.jdbc.support.GeneratedKeyHolder.getKey(GeneratedKeyHolder.java:73)
Run Code Online (Sandbox Code Playgroud)
我缺少什么想法?
我试图在Hibernate的二级缓存中缓存一个对象,该缓存在我的持久性映射文件中映射了一个复合id.日志说我第一次运行查询时,映射为composite-id的类被放入缓存中.但是,当我第二次运行查询时,不会从缓存中提取对象.而是再次运行查询.
Hibernate是否存在二级缓存复合ID的问题?
相关信息:
这就是我构建我的ID并执行我的查询的方式:
CompositeId id = new CompositeId(date, sessionId);
UserDetails user = (UserDetails) hibernateTemplate.load(UserDetails.class, id);
Run Code Online (Sandbox Code Playgroud)
这就是我的持久性映射文件定义上述内容的方式:
<class name="com.entities.UserDetails"
table="USER_DETAILS"
lazy="false">
<cache usage="read-write"/>
<composite-id name="userId" class="com.entities.CompositeId" unsaved-value="undefined">
<key-property name="userSessionId" column="SESSION_ID" />
<key-property name="dateCreated" column="DATE_CREATED" type="date" />
</composite-id>
Run Code Online (Sandbox Code Playgroud)
编辑:情节变厚....
当我将其更改为只读缓存策略时,它工作正常.事务性缓存行为似乎极不可预测.任何人都可以解释为什么上述情况发生在读写缓存中,但在只读时运行良好吗?此表未更新,因此不确定为什么事务语义会改变该实例中的内容.
我试图将四个元素放在flex-container
使用Flexbox的四个角落,我正在努力.我无法弄清楚如何证明个人的内容flex-items
.每当我尝试时,它最终将所有内容放在flex-container
左侧或右侧(或顶部/底部,取决于主轴).
HTML:
<div class="container">
<div class="top-left">
TL
</div>
<div class="top-right">
TR
</div>
<div class="bottom-left">
BL
</div>
<div class="bottom-right">
BR
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
这是我的CSS:
.container {
display: -webkit-flex;
background-color:#ccc;
}
.top-left {
/* ? */
}
.top-right {
}
.bottom-left {
}
.bottom-right {
}
Run Code Online (Sandbox Code Playgroud)
这是一个小提琴,说明我正在尝试做什么:
java ×3
hibernate ×2
amazon-ecr ×1
angular-ui ×1
angularjs ×1
css ×1
css3 ×1
dto ×1
ehcache ×1
final ×1
flexbox ×1
html ×1
interface ×1
jdbctemplate ×1
jls ×1
model ×1
modeling ×1
oop ×1
oracle10g ×1
primary-key ×1
restrictions ×1
spring ×1
spring-jdbc ×1