diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/support/JpaMetamodelEntityInformation.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/support/JpaMetamodelEntityInformation.java index f3470b178..8a9bbc650 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/support/JpaMetamodelEntityInformation.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/support/JpaMetamodelEntityInformation.java @@ -46,6 +46,7 @@ import org.springframework.data.jpa.repository.query.JpaMetamodelEntityMetadata; import org.springframework.data.jpa.util.JpaMetamodel; import org.springframework.data.util.DirectFieldAccessFallbackBeanWrapper; import org.springframework.util.Assert; +import org.springframework.util.ClassUtils; /** * Implementation of {@link org.springframework.data.repository.core.EntityInformation} that uses JPA {@link Metamodel} @@ -321,9 +322,14 @@ public class JpaMetamodelEntityInformation extends JpaEntityInformationSu } private static Set> findAttributes(IdentifiableType source) { - return source.hasSingleIdAttribute() - ? Collections.singleton(source.getId(source.getIdType().getJavaType())) - : source.getIdClassAttributes(); + if (source.hasSingleIdAttribute()) { + for (SingularAttribute attribute : source.getSingularAttributes()) { + if (attribute.isId()) { + return Collections.singleton(attribute); + } + } + } + return source.getIdClassAttributes(); } private static List findAttributePaths(IdentifiableType source, @Nullable String prefix) { diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/sample/Trade.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/sample/Trade.java index 0e30de3cd..74121b3dc 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/sample/Trade.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/sample/Trade.java @@ -15,12 +15,7 @@ */ package org.springframework.data.jpa.domain.sample; -import jakarta.persistence.CascadeType; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.Id; -import jakarta.persistence.OneToMany; -import jakarta.persistence.Table; +import jakarta.persistence.*; import java.util.List; @@ -33,9 +28,13 @@ import java.util.List; @Table public class Trade { - @Id @GeneratedValue Integer id; + @Id + @GeneratedValue + @Column(name = "id") + private Integer id; - @OneToMany(mappedBy = "trade", cascade = CascadeType.ALL) List tradeOrders; + @OneToMany(mappedBy = "trade", cascade = CascadeType.ALL) + private List tradeOrders; public Trade() {} diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/sample/TradeItem.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/sample/TradeItem.java index b4b76b131..f3fede036 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/sample/TradeItem.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/sample/TradeItem.java @@ -15,12 +15,7 @@ */ package org.springframework.data.jpa.domain.sample; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.IdClass; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.Table; +import jakarta.persistence.*; /** * @author James Bodkin @@ -32,11 +27,18 @@ import jakarta.persistence.Table; @IdClass(TradeItemId.class) public class TradeItem { - @Id @ManyToOne TradeOrder tradeOrder; + @Id + @ManyToOne + @JoinColumn(name = "trade_id", referencedColumnName = "trade_id") + @JoinColumn(name = "trade_order_id", referencedColumnName = "number") + private TradeOrder tradeOrder; - @Id Integer number; + @Id + @Column(name = "number") + private Integer number; - @Column String type; + @Column(name = "type") + private String type; public TradeItem() {} diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/sample/TradeOrder.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/sample/TradeOrder.java index dce5caf88..eea924bd9 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/sample/TradeOrder.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/sample/TradeOrder.java @@ -15,13 +15,7 @@ */ package org.springframework.data.jpa.domain.sample; -import jakarta.persistence.CascadeType; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.IdClass; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.OneToMany; -import jakarta.persistence.Table; +import jakarta.persistence.*; import java.util.List; @@ -35,12 +29,17 @@ import java.util.List; @IdClass(TradeOrderId.class) public class TradeOrder { - @Id @ManyToOne - Trade trade; + @Id + @ManyToOne + @JoinColumn(name = "trade_id", referencedColumnName = "id") + private Trade trade; - @Id Integer number; + @Id + @Column(name = "number") + private Integer number; - @OneToMany(mappedBy = "tradeOrder", cascade = CascadeType.ALL) List tradeItems; + @OneToMany(mappedBy = "tradeOrder", cascade = CascadeType.ALL) + private List tradeItems; public TradeOrder() {} diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/HierarchicalIdClassRepositoryTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/HierarchicalIdClassRepositoryTests.java index e2e31c9a5..7d106106d 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/HierarchicalIdClassRepositoryTests.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/HierarchicalIdClassRepositoryTests.java @@ -49,7 +49,7 @@ import static org.assertj.core.api.Assertions.assertThat; @ContextConfiguration(classes = HierarchicalIdClassRepositoryTests.TestConfig.class) @Transactional public class HierarchicalIdClassRepositoryTests { - + @Autowired private TradeRepository tradeRepository; @Autowired private TradeItemRepository tradeItemRepository; @@ -92,5 +92,5 @@ public class HierarchicalIdClassRepositoryTests { @ImportResource("classpath:infrastructure.xml") static class TestConfig extends Config {} - + }