2016-01-29 83 views
2

一個關係我有數據庫架構的這一部分: schemaUser實體:一個與Hibernate的註解

@Entity 
@Table(name = "user", catalog = "ats") 
public class User implements java.io.Serializable{ 

    private static final long serialVersionUID = 1L; 
    private String username; 
    private boolean enabled; 
    private Role role; 
    private ClientVersion clientVersion; 
    private ClientLicense clientLicense; 
    @JsonIgnore 
    private Set<NotificationHasUser> notificationHasUsers = new HashSet<NotificationHasUser>(0); 

    public User() { 
    } 

    public User(String username, boolean enabled) { 
     this.username = username; 
     this.enabled = enabled; 
    } 

    public User(String username, boolean enabled, Role role, Set<NotificationHasUser> notificationHasUsers) { 
     this.username = username; 
     this.enabled = enabled; 
     this.role = role; 
     this.notificationHasUsers = notificationHasUsers; 
    } 

    @Id 
    @Column(name = "username", unique = true, nullable = false, length = 45) 
    public String getUsername() { 
     return this.username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    @Column(name = "enabled", nullable = false) 
    public boolean isEnabled() { 
     return this.enabled; 
    } 

    public void setEnabled(boolean enabled) { 
     this.enabled = enabled; 
    } 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "id_role", nullable = false) 
    public Role getRole() { 
     return this.role; 
    } 

    public void setRole(Role role) { 
     this.role = role; 
    } 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "id_clientVersion", nullable = false) 
    public ClientVersion getClientVersion() { 
     return this.clientVersion; 
    } 

    public void setClientVersion(ClientVersion clientVersion) { 
     this.clientVersion = clientVersion; 
    } 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.user") 
    public Set<NotificationHasUser> getNotificationHasUser() { 
     return this.notificationHasUsers; 
    } 

    public void setNotificationHasUser(Set<NotificationHasUser> notificationHasUsers) { 
     this.notificationHasUsers = notificationHasUsers; 
    } 

    @OneToOne(fetch = FetchType.LAZY, mappedBy = "user") 
    public ClientLicense getClientLicense(){ 
     return this.clientLicense; 
    } 

    public void setClientLicense(ClientLicense clientLicense){ 
     this.clientLicense = clientLicense; 
    } 
} 

一切工作正常,直到我添加了一個新的clientlicense。如果我添加此我收到一個無限循環:

Could not write content: Infinite recursion (StackOverflowError) (through reference chain: com.domain.User["clientLicense"]->com.domain.ClientLicense["user"]->com.domain.User["clientLicense"]->com.domain.ClientLicense["user"]->com.domain.User["clientLicense"]->com.domain.ClientLicense["user"]->com.domain.User["clientLicense"]->com.domain.ClientLicense["user"]->com.domain.User["clientLicense"]-.... 

這是我ClientLicense實體

@Entity 
@Table(name = "clientlicense", catalog = "ats") 
public class ClientLicense implements java.io.Serializable{ 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    private Integer idClientLicense; 
    private Date startDate; 
    private Date endDate; 
    private int counter; 
    private String macAddress; 
    private String cpuId; 
    private User user; 

     public ClientLicense() { 
     } 

     /** 
     * @param startDate 
     * @param endDate 
     * @param counter 
     * @param macAddress 
     * @param cpuId 
     * @param users 
     */ 
     public ClientLicense(Date startDate, Date endDate, int counter, String macAddress, String cpuId, User user) { 
      super(); 
      this.startDate = startDate; 
      this.endDate = endDate; 
      this.counter = counter; 
      this.setMacAddress(macAddress); 
      this.setCpuId(cpuId); 
      this.user = user; 
     } 

     @Id 
     @GeneratedValue(strategy = IDENTITY) 
     @Column(name = "id_clientLicense", unique = true, nullable = false) 
     public Integer getIdClientLicense() { 
      return this.idClientLicense; 
     } 

     public void setIdClientLicense(Integer idClientLicense) { 
      this.idClientLicense = idClientLicense; 
     } 


     @Column(name = "startDate", nullable = false) 
     public Date getStartDate() { 
      return this.startDate; 
     } 

     public void setStartDate(Date startDate) { 
      this.startDate = startDate; 
     } 

     @Column(name = "endDate", nullable = false) 
     public Date getEndDate() { 
      return this.endDate; 
     } 

     public void setEndDate(Date endDate) { 
      this.endDate = endDate; 
     } 


     @Column(name = "counter", nullable = false) 
     public int getCounter() { 
      return this.counter; 
     } 

     public void setCounter(int counter) { 
      this.counter = counter; 
     } 

     /** 
     * @return the macAddress 
     */ 
     @Column(name = "macAddress", nullable = false) 
     public String getMacAddress() { 
      return macAddress; 
     } 

     /** 
     * @param macAddress the macAddress to set 
     */ 
     public void setMacAddress(String macAddress) { 
      this.macAddress = macAddress; 
     } 

     /** 
     * @return the cpuId 
     */ 
     @Column(name = "cpuId", nullable = false) 
     public String getCpuId() { 
      return cpuId; 
     } 

     /** 
     * @param cpuId the cpuId to set 
     */ 
     public void setCpuId(String cpuId) { 
      this.cpuId = cpuId; 
     } 

     @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
     @JoinColumn(name = "id_username") 
     public User getUser() { 
      return this.user; 
     } 

     public void setUser(User user) { 
      this.user = user; 
     } 
    } 

這是我第OneToOne關係,什麼是正確的註解,我必須使用?我讀了一些例子,但我不明白,他們是不同的。

+0

不相同的列「的映射」'''ClientLicense'''需要的' ''用戶''對象?或者只能使用用戶ID? – DominicEU

+1

嘗試把'@ JsonIgnore'上'ClientLicense#user' –

+0

我把這個註釋的用戶類和它的作品,但我不能添加新clientLicense,我更新了我的問題用一個例子 – luca

回答

0

嘗試這樣的事情。

public class User { 
    private ClientLicense clientLicense; 

    @OneToOne(fetch = FetchType.LAZY, mappedBy = "user") 
    public ClientLicense getClientLicense() { 
     return this.clientLicense; 
    } 
} 

public class ClientLicense { 
    private User user; 

    @OneToOne 
    @JoinColumn(name = "id_username") 
    public User getUser() { 
     return this.user; 
    } 
} 
+0

它不工作,他無限循環的問題是json註釋。 – luca

0

問題是,兩個實體沒有辦法發現這兩個字段實際上是指定單個關係。因此,hibernate假定它們不是相同的關係,因此試圖獲取它們(因爲默認情況下一對一關係會被急切地取回)。

clientLicense前場添加@OneToOne(mappedBy = "user")User類告訴Hibernate,這個字段作爲user字段中ClientLicense

+0

mappedBy =「user」已經設置 – luca

+0

@luca沒有'@ JoinColumn'註解? – emjay

+0

@ JoinColumn在ClientLicense實體 – luca