2017-03-27 50 views
0

我想有相同的領域類的2場在我的實體,我得到這個錯誤:JPA實體與同類型的兩個字段

org.hibernate.MappingException: Could not determine type for: com.packt.webapp.domain.User, at table: opinions, for columns: [org.hibernate.mapping.Column(author)]

我的實體:

@Entity 
@Table(name="opinions") 
public class Opinion { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 
    @NotNull 
    private String text; 
    @NotNull 
    private String date; 
    @ManyToOne 
    @JoinColumn(name="commented_user") 
    private User writtenTo; 
    private User author; 

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

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 
    private String username; 
    private String password; 
    @OneToMany(mappedBy="writtenTo") 
    private List<Opinion> opinions; 

我只是想將意見映射到評論用戶和評論的存儲作者author字段中。當我刪除author字段時,一切正常。這個例子有什麼不對?

+0

爲什麼不從'User'中刪除'List views'並用JPQL查詢? – michaeak

+0

您是否試圖爲Written和作者使用ManyToOne批註? – jmw5598

+0

@michaeak你的意思是有2個簡單的字段,如:'commentedUser'和'author'?這是個好主意:)但我只是想知道爲什麼我的代碼不工作。 – crooked

回答

1

這是抱怨,它不知道如何映射author字段。您可以提供類似於您映射writtenTo的映射。一個意見有一個作者和一個作者可以撰寫很多意見。

如果您想忽略映射字段,請使用@Transient對其進行註釋。瞬態註釋防止現場被保存到數據庫,否則你必須映射它,像這樣:

意見實體:

@Entity 
@Table(name="opinions") 
public class Opinion { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 

    @NotNull 
    private String text; 

    @NotNull 
    private String date; 

    @ManyToOne 
    @JoinColumn(name="commented_user") 
    private User writtenTo; 

    // map author to User entity 
    @ManyToOne 
    @JoinColumn(name="authored_user") 
    private User author; 

    // getters and setters 
} 

用戶實體:

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

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 

    private String username; 

    private String password; 

    @OneToMany(mappedBy="writtenTo") 
    private List<Opinion> opinions; 

    // map opinions to the author 
    @OneToMany(mappedBy="author") 
    private List<Opinion> authoredOpinions; 

    // getters and setters 
} 
+1

請注意,除非重疊到預先存在的SQL模式上,否則'@ JoinColumn'通常是不必要的。 – chrylis

1

請嘗試註釋也作者?

@ManyToOne 
@JoinColumn(name="author") 
private User author; 
0

只是應用@ManyToOne兩個用戶字段的註釋。

@ManyToOne 
@JoinColumn(name="commented_user") 
private User writtenTo; 
@ManyToOne 
@JoinColumn(name="author") 
private User author; 

但是這樣的問題有更靈活的解決方案。用@ManyToMany替換@OneToMany和@ManyToOne關係。創建一個用戶和一個角色實體(帶有特定字段的實體的後代)。用戶可以有許多角色(作家,作者等),角色可以由許多用戶播放。在這種情況下,您可以改變主意並動態創建/刪除/附加/分離角色,而無需在現有表上更改任何數據結構。

@Entity 
public class User 
{ 
    @Id 
    private Long id; 
    @Column 
    private String name; 
    @ManyToMany 
    @JoinTable(
     name="User_Role", 
     [email protected](name="UserID", referencedColumnName="ID"), 
     [email protected](name="RoleID", referencedColumnName="ID")) 
    private List<Role> roles; 
} 

@Entity 
public class Role 
{ 
    @Id 
    private Long id; 
    @Column 
    private String name; 
    @ManyToMany(mappedBy="roles") 
    private List<User> users; 
} 

,你可以得到/使用實用工具類的角色ID /名稱檢查用戶角色:

puclic class RoleUtility 
{ 
    public Role getUserRoleByName(User user_, String roleName_) 
    { 
    User retRole = null; 
    Iterator<Role> i = roles_.iterator(); 
    while ((retRole == null) && i.hasNext()) 
    { 
     Role role = (Role) i.next(); 
     if (roleName_.isEqual(role.getName)) 
     retRole = role; 
    } 
    return retRole; 
    } 
} 

客戶端代碼,以檢查的作用:

User user = ... 
Role role = RoleUtility.getRoleByName(user.getRoles(), roleName); 

留在你用這個解決方案的例子,你可以添加審查員/調解員的意見或類似的東西,沒有任何數據結構的變化。

相關問題