2016-05-03 7 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 выставить только необходимые поля, и теперь я получаю ошибку ниже

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

Я понимаю, что это не формат JSON, но я думал, что GSON будет заботиться об этом или дайте мне знать, что я должен использовать другой способ исправить это

Он отображает результат, который выглядит как массив [{"id": 139, "projectName": "ABCD", "unitDetails": [{"unitDetailsID": 575, ......

+0

уродливое исправление будет добавлено {в начале вывода и} в конце вывода – Satya

+0

Если это так, я пойду с нижним, которое обязательно отправит JSON, но я хотел бы знать, что я отсутствует здесь с GSON Строка json = gson.toJson (listProject); model = json.substring (1, json.length() - 1); – CrazyMac

+0

Если я просто пытаюсь вернуть модель, как показано ниже, то я получаю иерархии Issue \t индекс общественного HttpHeaders() { \t \t модель = objProjectDAOImpl.getProjectDetails (USERID); \t \t return new DefaultHttpHeaders ("index"). DisableCaching(); \t} net.sf.json.JSONException: В иерархии есть цикл! – CrazyMac

ответ

0

Это может быть неправильное решение, но мне пришлось пойти с ним.

После того как я установил родительский класс, я обеспечил, чтобы дочерний класс не имел ссылки на родителя или не содержал какой-либо объект, ссылающийся на родительский класс, в основном установил ссылку на дочерние ссылки на null, чтобы он не шел в круге. Это сработало для меня

0

Почему вы не используете аннотацию @JsonIdentityInfo? У меня была такая же проблема несколько месяцев назад и с использованием

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

сделал трюк. Свойству id соответствует getId() в YourEntity. Аннотации @JsonIdentityInfo из библиотеки Джексона не Гсона. В качестве альтернативы вы можете использовать @JsonManagedReference и/или @JsonBackReference из той же библиотеки.

+0

Спасибо, я попробую. – CrazyMac