不久之前,我在这里看到了一个关于java包的细粒度组织的问题.例如,my.project.util,my.project.factory,my.project.service,等.
我现在找不到,所以我不妨问一下这个问题.
是否有关于Java程序包组织的最佳实践以及它们的内容?
如何在Java项目中组织课程?
例如,我正在与一些人合作的项目有一个名为beans的包.它最初是一个包含简单豆类的项目,但最终(通过糟糕的经验和缺乏时间)包含所有内容(几乎).我通过在工厂包中放置一些工厂类(使用创建bean的静态方法的类)来清理它们,但我们有其他类来执行业务逻辑,而其他类则执行简单处理(不使用业务逻辑),如检索来自属性文件的代码消息.
感谢您的想法和意见.
我正在尝试使用OAuth 2.0在移动应用程序的Web API中实现委派授权.根据规范,隐式授权流程不支持刷新令牌,这意味着一旦授予访问令牌一段特定时间,用户必须在令牌过期或撤销后再次向应用程序授予权限.我想这对于在浏览器上运行的一些javascript代码来说是一个很好的场景,正如规范中提到的那样.我试图最小化用户必须向应用授予权限以获取令牌的时间,因此看起来授权代码流是一个很好的选择,因为它支持刷新令牌.但是,此流程似乎很大程度上依赖于Web浏览器来执行重定向.我想知道如果使用嵌入式Web浏览器,这个流程对于移动应用程序仍然是一个不错的选择.
我在大型应用程序中遇到EAGER关系问题.此应用程序中的某些实体EAGER与其他实体有关联.这在某些功能中变成了"毒药".
现在我的团队需要优化这些功能,但我们不能将获取类型更改为LAZY,因为我们需要重构整个应用程序.
所以,我的问题:是否有办法在我返回的实体中忽略EAGERs关联来执行特定查询?
示例:当我有这个实体Person时,我想在查询人员时不带地址列表.
@Entity
public class Person {
@Column
private String name;
@OneToMany(fetch=FetchType.EAGER)
private List<String> address;
}
Query query = EntityManager.createQuery("FROM Person person");
//list of person without the address list! But how???
List<Person> resultList = query.getResultList();
Run Code Online (Sandbox Code Playgroud)
谢谢!
更新
我找到的唯一方法是不返回实体,只返回实体的某些字段.但我想找到一个可以返回实体的解决方案(在我的例子中,Person实体).
我在想是否可以在Hibernate中将同一个表映射两次.通过这种方式,我可以在没有EAGER关联的情况下映射同一个表.在一些情况下,这对我有帮助......
我正试图在一个@HandleBeforeSave事件中得到旧实体.
@Component
@RepositoryEventHandler(Customer.class)
public class CustomerEventHandler {
private CustomerRepository customerRepository;
@Autowired
public CustomerEventHandler(CustomerRepository customerRepository) {
this.customerRepository = customerRepository;
}
@HandleBeforeSave
public void handleBeforeSave(Customer customer) {
System.out.println("handleBeforeSave :: customer.id = " + customer.getId());
System.out.println("handleBeforeSave :: new customer.name = " + customer.getName());
Customer old = customerRepository.findOne(customer.getId());
System.out.println("handleBeforeSave :: new customer.name = " + customer.getName());
System.out.println("handleBeforeSave :: old customer.name = " + old.getName());
}
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用该findOne方法获取旧实体,但这将返回新事件.可能是因为当前会话中的Hibernate/Repository缓存.
有没有办法获得旧实体?
我需要这个来确定给定的属性是否被更改.如果属性是更改,我需要执行一些操作.
我有一个分支,是一个分支的分支master。release如果你愿意的话,它更像是一个分支。该release分支受到保护。
master ---> release
Run Code Online (Sandbox Code Playgroud)
从这个release分支开始,我将我的功能从它中分离出来并将其合并到:
master ---> release <--- features
Run Code Online (Sandbox Code Playgroud)
现在,一旦我的功能进入这个release分支,就会出现合并冲突。我的问题就在这里。我知道如果它不是受保护的分支,如何解决冲突,但我不知道如何解决它。
我尝试做的是这样的:
master ---> release ---> release-fix
Run Code Online (Sandbox Code Playgroud)
在 中release-fix,我会重新设置基础master并将其向上推,并使该 PR 的基础成为分支release。但是当我制作 PR 时,它说它仍然无法自动合并。这是做这样的事情的正确方法吗?
我正在使用hibernate,我遇到了创建一个hql查询的问题,该查询获取了我对象的所有子项.
例如:对象用户有一个汽车列表和一个好友列表.
为了让用户获得他的汽车,我将使用以下查询:
from User u left join fetch u.cars where u.id = ?
Run Code Online (Sandbox Code Playgroud)
这工作得很好,所以我认为这将是很容易得到用户用他的车和他的朋友与以下查询:
from User u left join fetch u.cars left join fetch u.friends where u.id = ?
Run Code Online (Sandbox Code Playgroud)
但这给了我以下错误:
HibernateException:无法同时获取多个包
现在我的问题是:在hibernate中获取多个子节点的正确方法是什么?
我有这样的 JPA 存储库和 JPQL 查询:
@Query("SELECT c from Campaign c" +
" left join fetch c.postsList p on p.status = :postStatus" +
" left join fetch p.platform" +
" left join fetch c.campaignStatistics stat on stat.updateDate = :updateDate" +
" where c.id =:id")
Campaign findCampaignWithPosts(
@Param("id") Long id,
@Param("postStatus") PostStatus postStatus,
@Param("updateDate") LocalDate updateDate);
Run Code Online (Sandbox Code Playgroud)
但它不起作用。我得到:
org.hibernate.hql.internal.ast.QuerySyntaxException: with-clause not allowed on fetched associations; use filters
Run Code Online (Sandbox Code Playgroud)
我去研究了有关 JPA 2.1 规范的信息,这就是我发现的:
用于连接的连接条件来自映射的连接列。这意味着 JPQL 用户通常不必知道每个关系是如何连接的。在某些情况下,需要向连接条件附加附加条件,通常是在外部连接的情况下。这可以通过 ON 子句来完成。ON 子句在 JPA 2.1 规范中定义,并且某些 JPA 提供程序可能支持。EclipseLink : …
我正在使用HQL查询来获取某些记录.如果我使用LEFT JOIN FETCH我的目标实体中的集合将包含重复记录.如果我只使用左连接,它不会.我想当Hibernate懒惰地加载记录时,它避免了重复.
"SELECT z FROM ", TableA.TABLE_NAME, " z ", //
"LEFT JOIN FETCH z.attributeX pv ", //
"LEFT JOIN FETCH pv.attributeY anteil ", //
"LEFT JOIN FETCH z.attributeB kma ", //
"LEFT JOIN FETCH kma.attributeC ", //
"WHERE anteil.attributeD.attributeE.id = :eId ", //
"AND pv.attributeG.id = :gId ");
Run Code Online (Sandbox Code Playgroud)
我的实体TableA有一个指向TablePV(LEFT JOIN FETCH z.attributeX pv)的链接
TablePV有一个TableY(LEFT JOIN FETCH pv.attributeY anteil)的集合
现在Hibernate将正确映射所有内容,除了孩子们TablePV.它将包含几次相同的记录.一个明显的TableA没有帮助,因为那里没有重复.我可以手动删除那些非常不合适的记录.
我正在为我的项目开发一个通用的REST API,我想知道当我有一个包含2个或更多主键的表/资源时该怎么做.
例如,假设我有一个名为"question"的表,其中包含两个主键(日期和类型),我需要创建资源REST URI.遵循标准架构的最佳方法是什么api/{resource}/{id}?
也许是这样的:api/question/{:date},{:type}?最好的方法是什么?
谢谢.
我有一个在Kubernetes集群中的Docker容器中运行的webapp。该应用程序具有一个我想定期调用的端点。该应用程序在多个节点/吊舱中运行,重要的是只有一个节点执行端点发起的任务。我看过Kubernetes Cron Jobs,但没有找到有关从Kubernetes Cron Job调用端点的任何文档。有人有解决这个问题的建议吗?在只有一个节点执行任务的群集中,您如何处理调度?