jpa双向关系绑定错误

时间:2016-12-20 02:38:23

标签: jpa spring-data-jpa

我有两个实体,一个州和一个位置。一个国家可以有许多地方。 这种映射应该非常简单。

    @Entity
    @Table(name="Locations")
    public class Location {

        public Location() {};

        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        private int id;         


       @ManyToOne 
       @JoinColumn(name="StateCode")
       private State state;
}

和州级:

@Entity
@Table(name="States")
public class State {

    private static final Logger log = LoggerFactory.getLogger(State.class);

    public State() {
        locations = new ArrayList<Location>();

    };


      @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER,    mappedBy="location")    
     private Collection<Location> locations;

    @Id
    @Column(name="StateCode", nullable=false, length=6)   
    private String stateCode;


    public Collection<Location> getLocations() {
        return locations;
    }    

    public void setLocations( Collection<Location> locations ) {
        this.locations = locations;
    }    


    public String getStateCode() {
        return stateCode;
    }

    public void setStateCode(String code) {
        this.stateCode = code;
    }

然而我收到此错误: AnnotationException mappedBy引用未知的目标实体属性:net.rallaesystems.vibracheck.model.State.locations中的net.rallaesystems.vibracheck.model.Location.location

我遵循了将映射更改为“州”字段的建议。使用此代码,但

@Repository
public interface StateRepository extends CrudRepository<State, String>{     
    List<State> findAll();
}

在一个简单的控制器中调用,状态的序列化进入无限循环。也许序列化库存在问题?我认为是杰克逊。

2 个答案:

答案 0 :(得分:0)

您应该将@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="location")更新为@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="state"),这表明州是所有者

state

中存在Location的位置
 @ManyToOne 
 @JoinColumn(name="StateCode")
 private State state;

答案 1 :(得分:0)

是的,正如有人回答的那样,你需要使用Location的有效属性,它是位置表上的外键(这里是location类的state属性,statecode是location表中的外键)。