小编Sti*_*ens的帖子

创建完美的JPA实体

我一直在使用JPA(实现Hibernate)一段时间,每次我需要创建实体时,我发现自己正在努力解决AccessType,immutable属性,equals/hashCode等问题.
因此,我决定尝试找出每个问题的一般最佳实践,并将其写下来供个人使用.
但是我不介意任何人对此发表评论或告诉我哪里错了.

实体类

  • 实现Serializable

    原因:规范说你必须这样做,但是有些JPA提供商并没有强制执行.Hibernate作为JPA提供程序并不强制执行此操作,但如果未实现Serializable,它可能会因为ClassCastException而陷入困境.

构造函数

  • 创建一个包含实体所有必填字段的构造函数

    原因:构造函数应始终将创建的实例保持在合理的状态.

  • 除了这个构造函数:有一个包私有默认构造函数

    原因:默认构造函数需要让Hibernate初始化实体; 允许private,但是在没有字节码检测的情况下,运行时代理生成和高效数据检索需要包私有(或公共)可见性.

字段/属性

  • 一般情况下使用字段访问,需要时使用属性访问

    原因:这可能是最有争议的问题,因为对于其中一个(属性访问与字段访问)没有明确和令人信服的论据; 然而,由于更清晰的代码,更好的封装以及不需要为不可变字段创建setter,因此字段访问似乎是最受欢迎的

  • 省略不可变字段的setter(访问类型字段不需要)

  • 属性可能是私有的
    原因:我曾经听说受保护对于(Hibernate)性能更好,但我可以在网上找到的是:Hibernate可以直接访问公共,私有和受保护的访问器方法,以及公共,私有和受保护的字段.选择取决于您,您可以匹配它以适合您的应用程序设计.

等于/的hashCode

  • 如果仅在持久化实体时设置此ID,则永远不要使用生成的id
  • 优先级:使用不可变值来形成唯一的Business Key,并使用它来测试相等性
  • 如果唯一的业务密钥不可用,则使用在初始化实体时创建的非瞬态UUID ; 有关更多信息,请参阅此精彩文章.
  • 从不参考相关实体(ManyToOne); 如果此实体(如父实体)需要成为业务密钥的一部分,则仅比较ID.只要您使用属性访问类型,在代理上调用getId()将不会触发实体的加载.

示例实体

@Entity
@Table(name = "ROOM")
public class Room implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    @Column(name = "room_id")
    private Integer id;

    @Column(name = "number") 
    private String number; //immutable

    @Column(name = "capacity")
    private Integer capacity;

    @ManyToOne(fetch = FetchType.LAZY, optional = …
Run Code Online (Sandbox Code Playgroud)

java hibernate jpa equals

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

将变量传递给JQuery UI对话框

我正在使用PHP删除记录.我想使用JQuery UI对话框来确认操作,但我不知道如何将变量(我的RecordID)传递给重定向URL函数,或者允许URL访问window.location.href.

$("#confirm" ).dialog({
resizable: false,
autoOpen: false,
modal: true,
buttons: {
    'OK': function() {
            window.location.href = 'url and myvar??';
        $( this ).dialog( "close" );
        },
    'Cancel': function() {
        $( this ).dialog( "close" );
        }
    }
});


$("#delete").click(function() {
    $("#confirm").dialog( "open" ).html ( "Are U Sure?" );
    return false;
});
Run Code Online (Sandbox Code Playgroud)

HTML

<a href='index.php?recordid=$row[recordid]' id='delete'>DELETE</a>
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

jquery-ui

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

删除网址中的版本号

如何删除或隐藏Wicket 1.5中引入的URL中的版本号?

安装页面没有帮助.

http://localhost/MyPage/SubPage?0
Run Code Online (Sandbox Code Playgroud)

url wicket wicket-1.5

23
推荐指数
1
解决办法
6812
查看次数

日食.将类型层次结构复制到剪贴板

当我在Eclipse中打开(无论是"类型层次" F4Ctrl+T),有没有办法到结果树拷贝文本到剪贴板?

PS Print Screen不是解决方案.

eclipse

22
推荐指数
2
解决办法
4224
查看次数

Maven Release Plugin - prepare创建Snapshot版本的标签而不是发行版本

我有以下项目结构:

  • 骨架
    • 框架父母-POM
    • 框架出头
    • ...

在framework-parent-pom的pom.xml中我定义了以下插件:

<plugin>
    <artifactId>maven-release-plugin</artifactId>
    <version>2.3.2</version>
    <configuration>
        <branchBase>http://.../svn/REPO/branches/framework</branchBase>
        <tagBase>http://.../svn/REPO/tags/releases/framework</tagBase>
        <tagNameFormat>release-@{project.version}</tagNameFormat>
        <releaseProfiles>release</releaseProfiles>
    </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

在SCM之后:

<scm>
    <developerConnection>scm:svn:http://.../svn/REPO/trunk/framework/framework-parent-pom</developerConnection>
</scm>
Run Code Online (Sandbox Code Playgroud)

当我运行以下命令时......

mvn release:prepare -DautoVersionSubmodules=true -Darguments="-DskipTests" -Dresume=false
Run Code Online (Sandbox Code Playgroud)

......一切似乎都顺利.

在本地创建了发布版本的JAR,并且POM已经很好地更新到下一个SNAPSHOT版本.同样在SVN,乍一看似乎没问题.已使用其中的所有框架项目创建标记.

但是,当查看标签的POM时,我发现它们仍然具有初始快照版本作为版本.这当然会导致执行步骤构建快照版本而不是发布版本.

我究竟做错了什么?

maven maven-release-plugin

16
推荐指数
3
解决办法
8045
查看次数

使用mapstruct映射带参数的集合

要使用mapstruct映射某个对象,我需要一些自定义后期处理,这需要一个额外的参数来完成它的工作:

@Mapper
public abstract class AlertConfigActionMapper {

    @Mappings({ @Mapping(target = "label", ignore = true)})
    public abstract AlertConfigActionTO map (AlertConfigAction action, Locale userLanguage);

    @AfterMapping
    public void setLabel (AlertConfigAction  action, @MappingTarget AlertConfigActionTO to, Locale userLanguage) {
        for (AlertConfigActionLabel label : action.getAlertConfigActionLabels()) {
            if (label.getLanguage().equals(userLanguage)) {
                to.setLabel(label.getLabel());
                break;
            } else if (label.getLanguage().equals(Locale.ENGLISH)) {
                to.setLabel(label.getLabel());
            }
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

这很好用.当我向此映射器添加以下方法时,问题开始:

public abstract ArrayList<AlertConfigActionTO> mapList (List<AlertConfigAction> actions, Locale userLanguage);
Run Code Online (Sandbox Code Playgroud)

我需要传递这个参数(userLanguage),但是在这种情况下mapstruct似乎"分解":我为这部分生成以下代码(这自然会产生编译错误):

@Override
public List<AlertConfigActionTO> mapList(List<AlertConfigAction> actions, Locale userLanguage) {
    if ( actions == null && userLanguage …
Run Code Online (Sandbox Code Playgroud)

java mapstruct

16
推荐指数
2
解决办法
2417
查看次数

拆分服务 - > Business Objects?

我相信我像许多人一样构建我的项目.您有一个数据层(DAO),服务层(服务)和表示层(Spring MVC,Wicket,...).

通常,服务开始变得非常简单和"短".然而,渐渐地,服务必须支持越来越多的用例,直到一段时间之后它成为一个具有许多行和方法并且难以阅读和维护的庞大类.那时你可以决定坚持下去或者开始重构,这是一项繁琐且"危险"的工作,可能需要大量的工作.

我正在寻找一种解决方案,以防止未来任何重构的需要.
一种方法可能是将您的服务拆分为多个子服务,并使您的原始服务成为服务外观.因此,例如,您可以使用UserServiceFacade代替大型UserService,该调用将调用委托给PasswordService,RegistrationService,....

我认为这不是一个糟糕的解决方案,但我对此并不太热心,因为:

  1. 很难提前确定哪些子服务分开工作; 如果您错过了判断,您可能仍需要向后重构或仅使用一种方法进行服务
  2. 如果例如PasswordService和RegistrationService需要通用功能,则重用Business Logic会更加困难

另一个解决方案可能是使用Business Objects(在我的理解中)也可以看到一个子服务,然后每个特定的UseCase一个,所以你可能有BO的像CreateUserBO,CheckPasswordBO,DeleteUserBO,....

我对这种方法更加热衷,因为在我的观察中,它提供了一些优势:

  1. BO本身是非常易读的,只有它的合同才需要它; 所有其余的都可以委托给其他BO,单个BO将是简短而重要的
  2. 易于重用的功能
  3. 更容易更改/切换某个UseCase的实现:只需用Spring注入另一个实现
  4. 更容易测试:只需要测试特定的UseCase,可以嘲笑其他BO的代理
  5. 协作:如果几个开发人员在处理同一服务时处理不同的BO,则会减少冲突

但我也看到了一些可能的缺点:

  1. 一点额外的工作(至少在排序方面)
  2. 还有更多的课程会降低项目的可读性吗?
  3. 另一个抽象层:需要一个额外的步骤来查找UseCase的实际实现

问题或者更确切的问题(抱歉)是:

  1. Business Objects是否是解决此问题的理想解决方案?
  2. 你是否同意我上面列出的BO的优点/缺点和/或你看到其他的?
  3. 还有其他(好的)解决方案来阻止大型服务毁了你的一天吗?

java design-patterns

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

F5刷新并不总是可用/在eclipse中工作

通常,如果我想在eclipse中刷新项目(或文件夹,工作集,......),我只需选择项目并点击即可F5.但有时候击球后没有任何反应F5.当我然后右键单击我在上下文菜单中看到的项目Refresh而不是Refresh... (F5).

因此,由于某种原因,项目的当前状态或类似不允许F5刷新.我现在在Indigo中遇到这个问题,但至少在之前的2个版本的eclipse中已经有了这个问题.

这是一个错误还是有(有效)原因F5有时候无法获得?

eclipse

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

在hibernate API中的ElementCollection createAlias

有谁知道是否以及如何使用hibernate标准API编写以下问题的解决方案(使用JPA API编写)?

更具体地说,我有一个Discussion实体,其中包含一个参与者列表(这是一个用户名列表):

@ElementCollection
@Column(name = "user_name")
@CollectionTable(name = "DISCUSSION_USER", joinColumns = @JoinColumn(name = "DISCUSSION_ID"))
@OrderColumn(name = "ORDER_INDEX")
private List<String> participants = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)

现在我需要检索给定用户名是参与者的所有讨论.

如果我为参与者创建了一个实体,这将是直截了当的:

    Criteria crit = getSession().createCriteria(Discussion.class);
    crit.createAlias("participants", "p");
    crit.add(Restrictions.eq("p.userName", portalUsername));
Run Code Online (Sandbox Code Playgroud)

但是我无法用非实体创建别名......

java hibernate criteria jpa-2.0

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

Apache Wicket Repeaters:概述

Wicket有很多AbstractRepeater实现:ListView,DataView,GridView,Loop,PropertyListView等.

就个人而言,我发现很难确定哪种视图对于哪种情况是理想的.我通常坚持使用DataView但这只是因为我已经习惯了.也许GridView对于场景A,对于B的PropertyListView来说会更好....

是否有人知道博客或任何教程,其中解释了观点的差异或任何谁可以解释哪个视图最适合哪个用例?

java wicket

14
推荐指数
1
解决办法
4927
查看次数