我正在映射不使用实体的主键的关系。使用与主键不同的列"引用columnname",即使发出额外的选择,也会引起冬眠,即使使用fetchype.lazy。
我的目标是使其表现得像常规映射,这意味着每次我需要查询主要实体时都不会发出额外的查询。
我已经尝试使用@lazytoone(lazytooneoption.no_proxy(,它解决了问题,但与杰克逊(JSON解析库(模块" jackson-datatype-hibernate5"相对于杰克逊的(JSON解析库(的工作不佳序列化结果。
这几乎就像我所遇到的那种情况一样:实体:
@Entity(name = "Book")
@Table(name = "book")
public class Book
implements Serializable {
@Id
@GeneratedValue
private Long id;
private String title;
private String author;
@NaturalId
private String isbn;
//Getters and setters omitted for brevity
}
@Entity(name = "Publication")
@Table(name = "publication")
public class Publication {
@Id
@GeneratedValue
private Long id;
private String publisher;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(
name = "isbn",
referencedColumnName = "isbn"
)
private Book book;
@Column(
name = "price_in_cents",
nullable = false
)
private Integer priceCents;
private String currency;
//Getters and setters omitted for brevity
}
存储库(Spring-Data,但您可以直接与EntityManager尝试(:
@Repository
public interface PublicationRepository extends JpaReadRepository <Publication, Long>
{
@Query ("SELECT d FROM Publication d WHERE d.publisher = ?1 ")
Optional <Publication> findByPublisher (String isbn);
}
谢谢
实现您要寻找的目标的唯一方法是将注释@ID移动到ISBN属性。
您可以将@generatedValue放在自动插入属性上。
注意:
1-确保您的equals/hc遵循域案例上的OID(对象ID(" hantalid" ISBN。
2-最好在DB级别上确保您的自然ID在其上具有独特的矛盾。