2017-09-12 1 views
0

Ich erhalte einen Fehler, wenn ich versuche, 2 Tabellen im Ruhezustand beizutreten. Kopierter Code hier.java.lang.StackOverflowError beim Zugriff auf Daten mit Hibernate

Problem ist mit Zuordnung von Adresse und Benutzereinheiten. Jeder Benutzer kann mehrere Adressen haben, dies ist die Voraussetzung. Bitte helfen Sie.

Kopierte Tabellen DDL-Anweisungen unten. Es ist eine zu viele Beziehung zwischen Benutzer und Adresstabelle.

SQLs Tabellen:

CREATE TABLE `appuser` (
    `user_id` int(11) NOT NULL AUTO_INCREMENT, 
    `first_name` varchar(255) NOT NULL, 
    `last_name` varchar(255) DEFAULT NULL, 
    `email_address` varchar(1024) NOT NULL, 
    `password` varchar(1024) NOT NULL, 
    `active` tinyint(1) DEFAULT '1', 
    `popularity_rating` int(11) DEFAULT NULL, 
    `join_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`user_id`) 
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 

CREATE TABLE `address` (
    `address_id` int(11) NOT NULL AUTO_INCREMENT, 
    `address_line1` varchar(38) NOT NULL, 
    `address_line2` varchar(38) NOT NULL, 
    `city` varchar(38) NOT NULL, 
    `state` varchar(38) NOT NULL, 
    `zip` varchar(10) NOT NULL, 
    `address_type` varchar(45) NOT NULL, 
    `user_id` int(11) NOT NULL, 
    PRIMARY KEY (`address_id`), 
    KEY `fk_address_user_idx` (`user_id`), 
    CONSTRAINT `fk_address_user` FOREIGN KEY (`user_id`) REFERENCES `appuser` (`user_id`) 
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 

oben genannte Adresse und USER Tabellen verknüpft mir Stackoverflow geben.

Erwartetes Ergebnis ist:

{ 
    "userId": 1, 
    "firstName": "alb", 
    "lastName": "va", 
    "emailAddress": "[email protected]", 
    "password": "albva", 
    "addresses": [ 
     { 
      "addressLine1": "222 plano pkwy", 
      "addressLine2": "apt 22", 
      "city": "plano", 
      "state": "tx", 
      "zip": "75034", 
      "country": null 
     }, { 
      "addressLine1": "555 plano pkwy", 
      "addressLine2": "apt 11", 
      "city": "plano", 
      "state": "tx", 
      "zip": "75024", 
      "country": null 
     } 
    ], 
    "popularityRating": 6, 
    "joinDate": 1504897922000, 
    "roles": [] 
} 

Ergebnis ich immer bin, während der Web-Service-Aufruf eine unendliche loop.Which ist Stack-Überlauf-Fehler verursacht:

{"userId":2,"firstName":"rax","lastName":"tax","emailAddress":"[email protected]","password":"raxtax","addresses":[{"addressLine1":"2001 spring creek","addressLine2":"apt 724","city":"plano","state":"tx","zip":"75074","country":null,"addressType":null,"user":{"userId":2,"firstName":"rax","lastName":"tax","emailAddress":"[email protected]","password":"raxtax","addresses":[{"addressLine1":"2001 spring creek","addressLine2":"apt 724","city":"plano","state":"tx","zip":"75074","country":null,"addressType":null,"user":{"userId":2,"firstName":"rax","lastName":"tax","emailAddress":"[email protected]","password":"raxtax","addresses":[{"addressLine1":"2001 spring creek","addressLine2":"apt 724","city":"plano","state":"tx","zip":"75074","country":null,"addressType":null,"user":{"userId":2,"firstName":"rax","lastName":"tax","emailAddress":"[email protected]","password":"raxtax","addresses":[{"addressLine1":"2001 spring creek","addressLine2":"apt 724","city":"plano","state":"tx","zip":"75074","country":null,"addressType":null,"user":{"userId":2,"firstName":"rax","lastName":"tax","emailAddress":"[email protected]","password":"raxtax","addresses":[{"addressLine1":"2001 spring creek","addressLine2":"apt 724","city":"plano","state":"tx","zip":"75074","country":null,"addressType":null,"user":{"userId":2,"firstName":"rax","lastName":"tax","emailAddress":"[email protected]","password":"raxtax","addresses":[{"addressLine1":"2001 spring creek","addressLine2":"apt 724","city":"plano","state":"tx","zip":"75074","country":null,"addressType":null,"user":{"userId":2,"firstName":"rax","lastName":"tax","emailAddress":"[email protected]","password":"raxtax","addresses":[{"addressLine1":"2001 spring creek","addressLine2":"apt 724","city":"plano","state":"tx","zip":"75074","country":null,"addressType":null,"user": ... 
+1

Wo ist der Stack-Trace? –

Antwort

0

Wenn Sie versuchen, zwei Tabellen zu verknüpfen Wie Sie bereits erwähnt haben, hängt es zwangsläufig von einer Endlosschleife ab, da Tabelle A versucht, Daten aus Tabelle B abzurufen. Tabelle B hat eine Abhängigkeit von Tabelle A und versucht, die Daten aus Tabelle A abzurufen Endlosschleife und setzt damit fort, den Stapelüberlauf exc zu verursachen eption. Die Lösung besteht darin, Ihre Felder mit @JsonManagedReference und @JsonBackReference zu kommentieren. Damit wird die mit @JsonManagedReference markierte Klasse serialisiert, während die mit @JsonBackReference markierte Klasse nicht serialisiert wird. Dies unterbricht die Endlosschleife. In Ihrem Code würden Ihre Entitäten so aussehen;

/*ADDRESS table entity mapping */ 

@Entity 
@Table(name = "ADDRESS") 
public class AddressEntity { 

@ManyToOne(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }) 
@JoinColumn(name = "user_id") 
@JsonBackReference 
private UserEntity user; 

// setters and getters and other attributes. 

} 


/* APPUSER table entity mapping */ 

@Entity 
@Table(name = "APPUSER") 
public class UserEntity { 

@Id 
@GeneratedValue 
@Column(name = "USER_ID") 
private Long userId; 

@OneToMany(fetch = FetchType.EAGER, mappedBy = "user") 
@JsonManagedReference 
private Set<AddressEntity> addresses; 

// setters and getters and other attributes. 

}

Verwandte Themen