我一直在使用JPA(实现Hibernate)一段时间,每次我需要创建实体时,我发现自己正在努力解决AccessType,immutable属性,equals/hashCode等问题.
因此,我决定尝试找出每个问题的一般最佳实践,并将其写下来供个人使用.
但是我不介意任何人对此发表评论或告诉我哪里错了.
实现Serializable
原因:规范说你必须这样做,但是有些JPA提供商并没有强制执行.Hibernate作为JPA提供程序并不强制执行此操作,但如果未实现Serializable,它可能会因为ClassCastException而陷入困境.
创建一个包含实体所有必填字段的构造函数
原因:构造函数应始终将创建的实例保持在合理的状态.
除了这个构造函数:有一个包私有默认构造函数
原因:默认构造函数需要让Hibernate初始化实体; 允许private,但是在没有字节码检测的情况下,运行时代理生成和高效数据检索需要包私有(或公共)可见性.
一般情况下使用字段访问,需要时使用属性访问
原因:这可能是最有争议的问题,因为对于其中一个(属性访问与字段访问)没有明确和令人信服的论据; 然而,由于更清晰的代码,更好的封装以及不需要为不可变字段创建setter,因此字段访问似乎是最受欢迎的
省略不可变字段的setter(访问类型字段不需要)
@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) 我正在使用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)
有没有办法做到这一点?
如何删除或隐藏Wicket 1.5中引入的URL中的版本号?
安装页面没有帮助.
http://localhost/MyPage/SubPage?0
Run Code Online (Sandbox Code Playgroud) 当我在Eclipse中打开(无论是"类型层次" F4或Ctrl+T),有没有办法到结果树拷贝文本到剪贴板?
PS Print Screen不是解决方案.
我有以下项目结构:
在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时,我发现它们仍然具有初始快照版本作为版本.这当然会导致执行步骤构建快照版本而不是发布版本.
我究竟做错了什么?
要使用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) 我相信我像许多人一样构建我的项目.您有一个数据层(DAO),服务层(服务)和表示层(Spring MVC,Wicket,...).
通常,服务开始变得非常简单和"短".然而,渐渐地,服务必须支持越来越多的用例,直到一段时间之后它成为一个具有许多行和方法并且难以阅读和维护的庞大类.那时你可以决定坚持下去或者开始重构,这是一项繁琐且"危险"的工作,可能需要大量的工作.
我正在寻找一种解决方案,以防止未来任何重构的需要.
一种方法可能是将您的服务拆分为多个子服务,并使您的原始服务成为服务外观.因此,例如,您可以使用UserServiceFacade代替大型UserService,该调用将调用委托给PasswordService,RegistrationService,....
我认为这不是一个糟糕的解决方案,但我对此并不太热心,因为:
另一个解决方案可能是使用Business Objects(在我的理解中)也可以看到一个子服务,然后每个特定的UseCase一个,所以你可能有BO的像CreateUserBO,CheckPasswordBO,DeleteUserBO,....
我对这种方法更加热衷,因为在我的观察中,它提供了一些优势:
但我也看到了一些可能的缺点:
问题或者更确切的问题(抱歉)是:
通常,如果我想在eclipse中刷新项目(或文件夹,工作集,......),我只需选择项目并点击即可F5.但有时候击球后没有任何反应F5.当我然后右键单击我在上下文菜单中看到的项目Refresh而不是Refresh... (F5).
因此,由于某种原因,项目的当前状态或类似不允许F5刷新.我现在在Indigo中遇到这个问题,但至少在之前的2个版本的eclipse中已经有了这个问题.
这是一个错误还是有(有效)原因F5有时候无法获得?
有谁知道是否以及如何使用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)
但是我无法用非实体创建别名......
Wicket有很多AbstractRepeater实现:ListView,DataView,GridView,Loop,PropertyListView等.
就个人而言,我发现很难确定哪种视图对于哪种情况是理想的.我通常坚持使用DataView但这只是因为我已经习惯了.也许GridView对于场景A,对于B的PropertyListView来说会更好....
是否有人知道博客或任何教程,其中解释了观点的差异或任何谁可以解释哪个视图最适合哪个用例?