2016-02-12 157 views
0

我有如下三個實體:如何使用@OneToMany和@ManyToOne嵌套?

@Data 
@NoArgsConstructor 
@AllArgsConstructor 
@EqualsAndHashCode(exclude = {"id", "bricksets", "themes"}) 
@Entity 
public class Brand { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id;    // Unique database primary key 

    @OneToMany(mappedBy = "brand", cascade = CascadeType.ALL) 
    private List<Brickset> bricksets; 

    @OneToMany(mappedBy = "brand", cascade = CascadeType.ALL) 
    private List<Theme> themes; 

    @NotNull 
    private String name; 
} 

@Data 
@NoArgsConstructor 
@AllArgsConstructor 
@EqualsAndHashCode(exclude = {"id"}) 
@ToString(exclude={"brand", "theme"}) 
@Entity 
public class Brickset { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id;   // Unique database primary key 

    @NotNull 
    private String number;  // set number 

    @ManyToOne 
    @JoinColumn(name = "brand_id") 
    private Brand brand; 

    @ManyToOne 
    @JoinColumn(name = "theme_id") 
    private Theme theme; 
} 

@Data 
@NoArgsConstructor 
@AllArgsConstructor 
@EqualsAndHashCode(exclude = {"id"}) 
@ToString(exclude={"brand", "brickset"}) 
@Entity 
public class Theme { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id;    // Unique database primary key 

    @NotNull 
    private String name; 

    @ManyToOne 
    @JoinColumn(name = "brand_id") 
    private Brand brand; 

    @OneToMany(mappedBy = "Theme", cascade = CascadeType.ALL) 
    private List<Brickset> brickset; 
} 

但我遇到編譯如下錯誤,我嘗試自己解決這個問題,但我在JPA /休眠很新,你能幫助我,我怎麼能下一步呢?我認爲這個問題是我在Entity Theme中使用了ManyToOne和OneToMany,可能會被JPA/Hibernate弄糊塗,我可以理解嗎?

Caused by: org.hibernate.AnnotationException: Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements: com.zangland.entity.Theme.brickset 
+1

您指定類型而不是「mappedBy」屬性的目標名稱。它應該是'主題'而不是'主題'在最後@OneToMany – stg

回答

1

您需要使用Collection作爲@OneToMany註釋。

Hibernate要求持久化的集合值域被聲明爲接口類型。

實際的接口可能是java.util.Setjava.util.Collectionjava.util.Listjava.util.Mapjava.util.SortedSetjava.util.SortedMap或任何你喜歡( 「任何你喜歡的類型」 代表你需要編寫的org.hibernate.usertype.UserCollectionType的實現。)

@OneToMany(mappedBy = "theme", cascade = CascadeType.ALL) 
    private Set<Brickset> brickset; 
+0

謝謝,我試過了,現在錯誤是由:org.hibernate.AnnotationException:mappedBy引用一個未知的目標實體屬性:com.zangland.entity。 Brickset.Theme in com.zangland.entity.Theme.brickset – mikezang

+1

@mikezang試用小寫'主題' – Patrick

相關問題