如何正确注释休眠实体

时间:2016-09-16 14:05:32

标签: java hibernate spring-mvc entity hibernate-mapping

为我的MVC webapp编写一些常用测试,并在findById()测试时停止。 我的模型类:

for t1&t2 in 62 63 64 65; do

 R -q -e "library(pastecs);d <- read.table('ageecent.txt', header = F,sep=' ');
vart1 =var(d[,$t1]); vres_t1=vart1*0.75; 
va_t1=(vart1*0.25);vart2=var(d[,$t2]); vres_t2=vart2*0.75; 
va_t2=(vart2*0.25); cor=cor(d[,$t1],d[,$t2]); 
write.table(va_t1,'va_t1', row.names=F, col.names=F);
write.table(vres_t1,'vres_t1',row.names=F,col.names=F);
write.table(va_t2,'va_t2',row.names=F,col.names=F);
write.table(vres_t2,'vres_t2',row.names=F,col.names=F);
write.table(cor,'cor',row.names=F,col.names=F)"

done

我的测试代码:

@Entity
public class Product {
    @Id
    @GeneratedValue (strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    private String description;

    private double purchasePrice;

    private double retailPrice;

    private double quantity;

    @ManyToOne
    @JoinColumn (name = "supplier_id")
    private Supplier supplier;

    @ManyToOne
    @JoinColumn (name = "category_id")
    private Category category;

@Entity
public class Category {
    @Id
    @GeneratedValue (strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    private String description;

    @LazyCollection(LazyCollectionOption.FALSE)
    @OneToMany
    @Cascade(org.hibernate.annotations.CascadeType.ALL)
    private List<Product> products;

@Entity
public class Supplier {
    @Id
    @GeneratedValue (strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @LazyCollection(LazyCollectionOption.FALSE)
    @Cascade(org.hibernate.annotations.CascadeType.ALL)
    @OneToOne
    private Contact contact;

    @LazyCollection(LazyCollectionOption.FALSE)
    @OneToMany
    private List<Product> products;

好吧,断言失败了,因为product.category.products和product.supplier.products属性不同,正如你在pic上看到的那样: enter image description here 一个产品为null,另一个为{PersistentBag}。 当然,我可以通过编写自定义equals方法(它将忽略这些属性)轻松破解它,但确定它不是最好的方法。

那么,为什么这些领域不同? 我确信在实体字段的正确注释中有解决方案。

1 个答案:

答案 0 :(得分:1)

两个指针:

  • 您在关系字段中使用@LazyCollection(LazyCollectionOption.FALSE),因此当您检索实体时ORM会动态加载带有该注释的字段,而在您的单元测试夹具中创建的entites是在您的ORM之外创建的不重视这些领域。
  • 即使您删除了@LazyCollection(LazyCollectionOption.FALSE),如果您想要使用检索到的实体和手工创建的实体执行assertEquals(),也可能会有其他差异。例如,对于Hibernate,您的懒惰List不会是null,而是PersistentList的实例。

所以,你应该执行一些工作来执行断言 您可以单独检查属性,也可以使用Reflection来断言字段并忽略预期对象中空字段的比较。

检查http://www.unitils.org/tutorial-reflectionassert.html,它可能对您有帮助。