小编sma*_*sma的帖子

视图层中的DTO或域模型对象?

我知道这可能是一个古老的问题,但更好的做法是什么?在应用程序的所有层中使用域模型对象,甚至在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更加努力;

听起来好像我已经考虑到了这些,但我还没有在一个应用程序中工作,在这个应用程序中,模型对象可以在每个实例中完全使用.具有不同寻常的用户需求的常规实际应用程序不能以这种方式工作.

model data-transfer-objects dto

49
推荐指数
3
解决办法
2万
查看次数

测试最终字段的初始化安全性

我试图简单地测试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)

java multithreading final thread-safety jls

30
推荐指数
3
解决办法
1722
查看次数

Hibernate Restrictions.in vs. Disjunction

除了更少的代码之外,使用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)

我问的原因是因为我在前者存在的情况下重构遗留代码,但我期待后者.如果它们都是相同的,我将单独保留遗留代码.

hibernate restrictions hibernate-criteria

15
推荐指数
2
解决办法
4万
查看次数

为什么传输对象需要实现Serializable?

我今天意识到我已经盲目地按照这个要求多年没有真正问过为什么.今天,我遇到了一个N​​otSerializableException和我从头开始创建的模型对象,我意识到足够了.

我被告知这是因为负载均衡服务器之间的会话复制,但我知道我在会话范围内看到了其他没有实现Serializable的对象.这是真正的原因吗?

java serialization data-transfer-objects

14
推荐指数
2
解决办法
9010
查看次数

模型对象应该有接口吗?

我正在我的系统中创建域模型.在设计模型对象时,我应该为每个实体对象创建接口吗?人们告诉我,我们的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)

我理解这个好处,但一般做法是什么?

java oop modeling interface

12
推荐指数
1
解决办法
7915
查看次数

使用命名空间在 AWS ECR 中存储图像

AWS 声称支持存储库上的命名空间规则,但我不\xe2\x80\x99 不遵循你应该如何设置它们。根据这里的文档:

\n
\n

存储库名称可以支持命名空间,您可以使用命名空间对相似的存储库进行分组。例如,如果有多个团队使用相同的注册表,则团队 A 可以使用 team-a 命名空间,而团队 B 使用 team-b 命名空间。每个团队都可以拥有自己的名为\nweb-app 的映像,但由于它们均以团队名称空间为前缀,\n这两个映像可以同时使用而不会相互干扰。团队 A 的映像将称为 team-a/web-app,而团队 B 的映像将称为 team-b/web-app。

\n
\n

所以我们在注册表中创建了一个存储库<registry ID>.dkr.ecr.<region>.amazonaws.com/mycompany/myproj

\n

基于此,我希望能够在此myproj名称空间中存储多个图像,例如:

\n

<registry ID>.dkr.ecr.<region>.amazonaws.com/mycompany/myproj/imageone:latest

\n

<registry ID>.dkr.ecr.<region>.amazonaws.com/mycompany/myproj/imagetwo:latest

\n

但是,当我尝试推送这些图像之一时,它告诉我该存储库mycompany/myproj/imageone不存在。我不知道为什么它认为这imageone是我的存储库名称的一部分,而不是我的图像名称:标签的一部分。我的存储库命名方式或图像命名/标记方式是否有问题?

\n

amazon-web-services amazon-ecr

11
推荐指数
1
解决办法
6166
查看次数

Angular UI路由器 - 默认参数

无论如何使用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'方法,而不是使用指令.我在下面添加了一个答案.

angularjs angular-ui angular-ui-router

9
推荐指数
1
解决办法
7569
查看次数

使用Spring的KeyHolder和以编程方式生成的主键

我使用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)

我缺少什么想法?

spring primary-key oracle10g spring-jdbc jdbctemplate

8
推荐指数
3
解决办法
2万
查看次数

Hibernate二级缓存复合ID

我试图在Hibernate的二级缓存中缓存一个对象,该缓存在我的持久性映射文件中映射了一个复合id.日志说我第一次运行查询时,映射为composite-id的类被放入缓存中.但是,当我第二次运行查询时,不会从缓存中提取对象.而是再次运行查询.

Hibernate是否存在二级缓存复合ID的问题?

相关信息:

  1. 使用Hibernate 3.1,ehcache 2.4.2
  2. 复合ID类实现可序列化
  3. 我在第二次运行查询时使用新的Hibernate会话
  4. 我正在使用hibernateTemplate.load(Class,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)

编辑:情节变厚....

当我将其更改为只读缓存策略时,它工作正常.事务性缓存行为似乎极不可预测.任何人都可以解释为什么上述情况发生在读写缓存中,但在只读时运行良好吗?此表未更新,因此不确定为什么事务语义会改变该实例中的内容.

hibernate ehcache second-level-cache composite-primary-key

8
推荐指数
1
解决办法
2680
查看次数

使用Flexbox对齐角落中的元素

我试图将四个元素放在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)

这是一个小提琴,说明我正在尝试做什么:

http://jsfiddle.net/JWNmZ/8/

html css css3 flexbox

8
推荐指数
1
解决办法
7878
查看次数