2014-12-07 56 views
0

說我有一個用戶表和一個UserRecordInfo表,它保存了用來更改用戶信息的操作。例如:Hibnerate ManyToOne總是級聯,當它沒有被要求時

用戶:

| UserID |用戶名|

| 1 |測試|

和UserRecordInfo:

| UserRecordInfoID |用戶ID |操作| oldValue | newValue |

| 1 | 1 |更新名稱| oldTest | test2 |

| 2 | 1 |更新名稱| test2 |測試|

顯然在Java中,當設計對象時,我不想在User中有一個UserRecordInfo字段,因爲每個用戶可能有數百個UserRecordInfo。我所擁有的是:

@Entity 
@Table(name="User") 
public class User { 
private userName; 
@Column(name = "userName") 
    public String getUserName() { 
     System.out.println("getting username"); 
     return userName; 
    } 
... 
} 

@Entity 
@Table(name="UserRecordInfo") 
public class UserRecordInfo { 
    private User user; 

    @JoinColumn(name = "UserID") // using javax.persistence.JoinColumn 
    @ManyToOne(fetch = FetchType.LAZY) // using javax.persistence.ManyToOne 
    public User getUser() { 
     return user; 
    } 
    public void setUser(User user) { 
     this.user = user; 
    } 

} 

我創造新的UserRecordInfo的方式是:

User u = {get user from hibernate} 
UserRecordInfo record = new UserRecordInfo(); 
record.setUser(u); 
.setNewName("test1"); 
... 

Session session = DBSessionHandler.getSession(); 
    Transaction tx = null; 
    try { 
     tx = session.beginTransaction(); 
     Serializable result = session.save(record); 
     tx.commit(); 
     return result; 
    } 
    catch (HibernateException ex) { 
     ex.printStackTrace(); 
     if (tx!=null) tx.rollback(); 
     throw ex; 
    } 
    finally { 
     DBSessionHandler.close(); 
    } 

但是好像每當我插入一個新的UserRecordInfo,用戶對象總是感動(println總是打印「獲取用戶名」)。這是爲什麼發生?難道我做錯了什麼?

+0

你有'User'類'@ Id'場? – DontRelaX 2014-12-07 19:22:09

+0

@DontRelaX是的,我只是爲了簡單起見,我沒有把它放在這裏。 – jamesdeath123 2014-12-08 01:45:54

回答

1

嘗試在@JoinColumn註釋中放置'updatable = false'屬性。

您可能想要將獲取類型標記爲@ManyToOne批註的'Eager'。

另外我會建議你註釋的字段,而不是getters。

的UserRecordInfo類將看起來像:該列是否包含在持久性提供生成的SQL UPDATE語句

(可選):

@Entity 
@Table(name="UserRecordInfo") 
public class UserRecordInfo { 

    @ManyToOne(optional = false, fetch = FetchType.EAGER) 
    @JoinColumn(name = "UserID", nullable = false, updatable = false) 
    @NotNull 
    private User user; 

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

文件的 '更新' 讀作。

這似乎是如果你想解決

相關問題