外键休眠注释

外键休眠注释

问题描述:

我无法设法使这个简单的外键约束工作。外键休眠注释

@Entity 
@Table(name = "wheel") 
@Data 
public class WheelEntity { 
    @Id 
    @Column(name = "id") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 
    ... 

@Entity 
@Table(name = "bike") 
@Data 
public class BikeEntity { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 

    @ManyToOne(targetEntity = WheelEntity.class, fetch=FetchType.EAGER, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}) 
    @JoinColumn(name = "wheel_1_id", referencedColumnName = "id") 
    @NotNull 
    private Integer wheel_1_id; 

    @ManyToOne(targetEntity = WheelEntity.class, fetch=FetchType.EAGER, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}) 
    @JoinColumn(name = "wheel_2_id", referencedColumnName = "id") 
    @NotNull 
    private Integer wheel_2_id; 
    ... 

当我要插入一个新的自行车,这里是持续的BikeEntity时,我得到的错误:

Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Integer field com.xxx.xxx.xxx.storage.WheelEntity.id to java.lang.Integer 
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167) 
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171) 
    at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58) 
    at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36) 
    at java.lang.reflect.Field.get(Field.java:393) 
    at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:39) 

无法设置为java.lang.Integer到java.lang.Integer中。 MMMMMM?奇怪!

的帮助

非常感谢在休眠您具有内部ENTITY2 ENTITY1参考创建关系。正确的方法是:

@Entity 
@Table(name = "wheel") 
@Data 
public class WheelEntity { 
    @Id 
    @Column(name = "id") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 
    ... 

@Entity 
@Table(name = "bike") 
@Data 
public class BikeEntity { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 

    @ManyToOne(targetEntity = WheelEntity.class, fetch=FetchType.EAGER, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}) 
    @JoinColumn(name = "wheel_1_id", referencedColumnName = "id") 
    @NotNull 
    private WheelEntity wheelEntity; 
+0

很多感谢杰伊史密斯,这是正确的答案。在开始时听起来像是一件奇怪的事情,但后来我意识到我可以使用'em.getReference()'来获取一个实例而不碰到数据库。 – user3173237