我有以下JPA映射(为了简洁起见,getter和setter都是从代码中生成的,DDL可能起作用,也可能不起作用):
费用
@Entity
public class Expense {
@Id
@GeneratedValue
private Long id;
private String name;
private Long amount;
private Boolean monthly;
@OneToOne
@JoinColumn(name = "category")
@Fetch(FetchMode.JOIN)
private Category category;
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private List<Label> labels = new ArrayList<>();
//constructor, getters and setters...
}
类别
@Entity
public class Category {
@Id
private String name;
//constructor, getters and setters...
}
标签
@Entity
public class Label {
@Id
private String name;
//constructor, getters and setters...
}
与JpaRepository一起使用
所以我使用的是一个JPA假设,它看起来像这样:
public interface ExpensesRepository extends JpaRepository<Expense, Long> {
@Query("SELECT e FROM Expense e LEFT JOIN FETCH e.category")
List<Expense> findAllExpensesExploded();
}
当我使用JpaRepository的默认findAll()方法时,我得到一个n1选择问题:
2017-01-03 19:35:22.665 DEBUG 26040 --- [nio-8080-exec-1] org.hibernate.SQL : select expense0_.id as id1_1_, expense0_.amount as amount2_1_, expense0_.category_name as category5_1_, expense0_.monthly as monthly3_1_, expense0_.name as name4_1_ from expense expense0_
2017-01-03 19:35:22.673 DEBUG 26040 --- [nio-8080-exec-1] org.hibernate.SQL : select category0_.name as name1_0_0_ from category category0_ where category0_.name=?
2017-01-03 19:35:22.674 TRACE 26040 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [VARCHAR] - [Rent]
2017-01-03 19:35:22.682 DEBUG 26040 --- [nio-8080-exec-1] org.hibernate.SQL : select category0_.name as name1_0_0_ from category category0_ where category0_.name=?
2017-01-03 19:35:22.683 TRACE 26040 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [VARCHAR] - [Insurance]
但是,当我使用自己的findAllExpensesExploded()方法时,我得到一个SQL查询:
2017-01-03 19:35:22.691 DEBUG 26040 --- [nio-8080-exec-1] org.hibernate.SQL : select expense0_.id as id1_1_0_, category1_.name as name1_0_1_, expense0_.amount as amount2_1_0_, expense0_.category_name as category5_1_0_, expense0_.monthly as monthly3_1_0_, expense0_.name as name4_1_0_ from expense expense0_ left outer join category category1_ on expense0_.category_name=category1_.name
我的期望是findAll()和findAllExpensesExploded()都用一个SQL查询执行。
默认获取模式是惰性的。使用Spring Data JPA时,使用@NamedEntityGgraph
和@EntityGgraph
注释总是一个很好的实践
whether the default findAll() should only be used for simple entities? (where simple is defined as no associations).
Fetch模式-LAZY将仅为主表激发。如果在代码中调用任何其他具有父表依赖关系的方法,那么它将触发fetchmode-SELECT。
我有一个具有依赖项的Spring Boot应用程序。我的实体类有一个带有列名的列注释。例如: 由此生成的SQL将创建为列名。在寻找解决方案之后,我发现解决了这个问题(列名取自列注释)。 但是,我的问题是为什么没有将naming_strategy设置为,JPA忽略列注释?也许冬眠方言与此有关?我正在连接到MS SQL 2014 Express,我的日志包含:
我创建一对一的关系,我希望有方法来获取相同的实体(Distributor.class),但是一个做懒惰的获取,另一个渴望。 我遇到的最大问题是,Spring数据JPA似乎忽略了FetchType,并急切地获取所有相关表(基于相关线程和Spring数据JPA文档)。使用分发服务器获取数据的所有Spring数据存储库方法。通过两个选项,从分发服务器和位置中急切地获取位置。通过使用@NamedEntit
说我有下面的JPA方法: 用户通过输入字段和选择字段过滤这些对象的列表,从而调用此方法: 在这种情况下,如果用户不使用该字段进行搜索,则布尔值可以是true、false或null。看起来JPA实际上是在搜索一个空值,而我希望它忽略任何空值。我已经能够使用以下代码进行此组合搜索: 这是可行的,但显然,在一个有8个搜索选项的页面上,这将成为一场噩梦。字符串参数没有这个问题,因为当用户不选择过滤器时,它
我已经添加了JVM start参数: 但在原木里我看到了
有什么想法为什么@primary在这里没有被考虑在内吗?
问题内容: 我的@Transactionnal注释似乎被忽略了。我对Spring容器的初始化没有任何错误。看来我的方法尚未被Spring TX框架代理。在执行服务的方法期间,JDBCTemplate会引发预期的RuntimeException。问题在于JDBC连接没有回滚,并且更改保持不变。stacktrace没有显示应该包装我的服务方法的代理的任何迹象。 编辑:添加了控制器的代码 编辑2:添加了