2016-05-03 11 views
1

私は多くの方法を試みましたが、私は詳細を投稿しています。ここでHibernate @onetomany Gsonとの循環参照エラー

は私の親クラスここ

@Entity 
@Table(name = "Project") 
//@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "@id") 
public class Project implements Serializable{ 
@Expose 
int id; 
@Expose 
String projectName; 
@Expose 
String userID; 
// Date dateCreated; 
@Expose 
String dateCreated; 
@Expose 
String status; 
@Expose 
String houseType; 

@Expose 
private List<UnitDetails> unitDetails = new ArrayList<>(); 
@Expose 
private List<RoomDetails> roomDetails = new ArrayList<>(); 
    @GeneratedValue 
@Column(name = "id") 
public int getId() { 
    return id; 
} 
    @OneToMany(mappedBy="unitDetails", fetch = FetchType.LAZY) 
public List<UnitDetails> getUnitDetails() { 
    return unitDetails; 
} 

public void setUnitDetails(List<UnitDetails> unitDetails) { 
    this.unitDetails = unitDetails; 
} 

@OneToMany(mappedBy="roomDetails", fetch = FetchType.LAZY) 
public List<RoomDetails> getRoomDetails() { 
    return roomDetails; 
} 

public void setRoomDetails(List<RoomDetails> roomDetails) { 
    this.roomDetails = roomDetails; 
} 

はここに私の子クラス

@Entity 
@Table(name="Unit_Details") 
//@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "@id") 
public class UnitDetails { 
@Expose 
int unitDetailsID; 
@Expose 
int designID; 
@Expose 
String unit; 
@Expose 
double length; 
@Expose 
double breadth; 
@Expose 
double height; 
@Expose 
String img; 
@Expose 
String type; 
@Expose 
String color; 

@JsonIgnore 
private Project unitDeTails; 

@Id 
@GeneratedValue 
@Column(name="unitDetailsID", unique=true, nullable=false) 
public int getUnitDetailsID() { 
    return unitDetailsID; 
} 
    @ManyToOne 
@JoinColumn(name="id", insertable=true, updatable=false) 
public Project getUnitDetails() { 
    return unitDeTails; 
} 

public void setUnitDetails(Project unitDetails) { 
    this.unitDeTails = unitDetails; 
} 

であることは私のコントローラは、私がどの巡回しなくても正常に詳細を保存することができました

public class ProjectController extends ActionSupport implements 
    ModelDriven<Object> { 
    public HttpHeaders index() { 

    model = objProjectDAOImpl.getProjectDetails(userID); 

    Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); 
    System.out.println(gson.toJson(model)); 
    model = gson.toJson(model); 
    return new DefaultHttpHeaders("index").disableCaching(); 
} 

ですエラー。取得しようとすると、循環参照エラーが発生しました。その後、私は必要なフィールドを公開するためにGsonを使用し、今私は、これはJSON形式ではないことを理解

HTTP Status 500 - A JSONObject text must begin with '{' at character 1 of 

以下のエラーが出ますが、私はGSONは、このの世話をするか、私が使用する必要が知っているだろうと思いましたこれを修正する別の方法

[{"" id ":139、" projectName ":" ABCD "、" unitDetails ":[{" unitDetailsID ":575、 ......

+0

出力の最初に出力の末尾に追加してください。 – Satya

+0

その場合、私はJSONを確実に送信するが、私は何かを知りたいここでGSONが見つからない String json = gson.toJson(listProject); モデル= json.substring(1、json.length() - 1); – CrazyMac

+0

私はちょうど、私は階層問題に \t公共HttpHeadersインデックス(){ \t \tモデル= objProjectDAOImpl.getProjectDetails(ユーザID)を取得するには、以下のようにモデルを返すようにしよう。 \t \t新しいDefaultHttpHeaders( "index")。disableCaching(); \t} net.sf.json.JSONException:階層にサイクルがあります。 – CrazyMac

答えて

0

これは正しい修正ではないかもしれませんが、私はそれに付随しなければなりませんでした。

親クラスを設定した後、親クラスへの参照を持たないか、親クラスを参照するオブジェクトを保持していることを確認しました。基本的には、子参照をnullに設定しています。円形である。それは私のために働いた

0

なぜ@JsonIdentityInfo注釈を使用しないのですか?私は数ヶ月前に同じ問題を抱えていました。

@JsonIdentityInfo(property = "id", generator = ObjectIdGenerators.PropertyGenerator.class, scope = YourEntity.class) 

でした。プロパティidはYourEntityのgetId()に対応します。 @JsonIdentityInfoアノテーションはGsonではなくJacksonライブラリからのものです。代わりに同じlibの@JsonManagedReferenceおよび/または@JsonBackReferenceを使用することもできます。

+0

ありがとう、私は試してみましょう。 – CrazyMac