2012-03-14 131 views
1

我是JPA的新手,需要一些幫助來獲取JPA中的Many to One關係。JPA多對一關係

我有下面的實體。

存儲所有用戶信息的用戶。用戶擴展Audiatable抽象類是舉辦auidt paramters像上次修改日期,創建日期等

我試圖添加其他領域lastUpdatedByUser應該得到牽強從lastUpdatedBy爲此我amtrying添加許多 - 一個關係。 但是,這種關係並不起作用,我在這裏做錯了什麼?

AuditableEntity.java

public abstract class AuditableEntity<T extends Entity<T, ID>, ID> implements Auditable { 

private static final long serialVersionUID = 1L; 

@Column(name = "cruserid") 
private Long createdBy; 


@Column(name = "crdate") 
@Type(type = JpaConstants.TYPE_LOCAL_DATE_TIME) 
private LocalDateTime createdOn; 

@Column(name = "chuserid") 
private Long lastUpdatedBy; 

@Column(name = "chdate") 
@Type(type = JpaConstants.TYPE_LOCAL_DATE_TIME) 
private LocalDateTime lastUpdatedOn; 

@Transient 
@ManyToOne(fetch = FetchType.LAZY, targetEntity = User.class) 
@JoinColumn(name = "usrId", referencedColumnName = "chuserid") 
private User lastUpdatedByUser; 

User.java

public class User extends AuditableEntity<User, Long> { 
private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "usrId") 
private Long id; 

@Column(name = "usrName") 
private String name; 

@Column(name = "loginame") 
private String loginName; 

}

回答

2

那麼,你標有@Transient的關聯,這意味着該字段不是持久的,應該是由JPA忽略。

而且您似乎也有兩個不同的字段來存儲相同的信息:lastUpdatedBylastUpdateByUser。取下第一個,並繪製第二個爲

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "chuserid") 
private User lastUpdatedByUser; 

這告訴該組織是一個多對一的用戶實體(無需指定targetEntity因爲它是字段的類型),並且這種關聯通過名爲「chuserid」的連接列在可審計實體的表中實現,並引用User實體的ID(referencedColumnName僅在使用複合ID時有用,或者當您通過作爲ID的列引用實體時纔有用)

+0

嗨,thnx的ans,但問題是,我們無法刪除lastUpdateBy ....它已經在很多地方在現有的代碼..所以我們想添加一個瞬變字段lastUpdateByUser只是爲了保存我們的目的爲現在...其種類o f weired設計但由於時間限制暫停重建 – 2012-03-14 08:51:49

+0

如果僅以只讀模式使用,則應該能夠如上所示移除lastUpdatedByUser的地圖,並將'lastUpdateBy'上的列標記爲不可插入和非標記更新。 – 2012-03-14 08:58:50

+0

thnx再次,它的工作原因是每個人最後的評論,但不幸的是lastUpdateBy不僅僅用於只讀模式......對於每個實體,它將被調用來更新進行最後更新的用戶ID。 – 2012-03-14 09:25:38